Kubernetes 集群搭建与容器部署全攻略
1. 前置准备
在搭建 Kubernetes 集群之前,需要在每台服务器上完成以下操作:
1. 安装 containerd。
2. 创建
/etc/containerd/config.toml
文件,并设置 cgroup 驱动。
3. 禁用交换分区。
4. 添加
/etc/modules-load.d/k8s.conf
文件,其中包含
br_netfilter
模块。
5. 编辑
/etc/sysctl.conf
文件以启用桥接。
完成上述操作后,重启所有节点:
sudo reboot
2. 安装 Kubernetes
节点重启完成后,开始安装 Kubernetes 所需的软件包。
1.
添加仓库密钥
:
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
- 添加仓库 :
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
- 更新本地索引 :
sudo apt update
- 安装 Kubernetes 软件包 :
sudo apt install kubeadm kubectl kubelet
这三个软件包的作用如下:
| 软件包 | 作用 |
| ---- | ---- |
| kubeadm | 用于初始化新集群、将节点加入现有集群以及升级集群版本。 |
| kubectl | 提供 Kubernetes 命令行工具,用于与集群交互和管理。 |
| kubelet | 作为节点间通信的代理,还暴露 API 端点以实现额外的通信和功能。 |
3. 初始化集群
在指定为控制器的节点上运行以下命令初始化集群:
sudo kubeadm init --control-plane-endpoint=172.16.250.216 --node-name controller --pod-network-cidr=10.244.0.0/16
参数说明
:
-
--control-plane-endpoint
:应设置为服务器的实际 IP 地址。
-
--node-name
:设置为控制器节点的主机名。
-
--pod-network-cidr
:这是 Pod 网络的 IP 方案,通常不需要更改。
初始化成功后,终端会输出一个加入集群的命令,将其复制并妥善保存。同时,还会有三个额外的命令需要在控制器节点上运行,将它们依次复制到终端执行。
4. 部署覆盖网络
使用以下命令部署 Flannel 覆盖网络,使集群更稳定:
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
5. 加入工作节点
在工作节点上执行之前保存的加入集群命令:
sudo kubeadm join 172.16.250.216:6443 --token zu5u3x.p45x0qkjl37ine6i \
--discovery-token-ca-cert-hash sha256...1360c
6. 验证节点状态
在控制器节点上使用以下命令验证节点状态:
kubectl get nodes
当所有节点的状态都为
Ready
时,集群搭建完成。
7. 部署容器
使用 Kubernetes 部署容器需要创建 YAML 文件,以下是一个部署 NGINX 容器的示例:
apiVersion: v1
kind: Pod
metadata:
name: nginx-example
labels:
app: nginx
spec:
containers:
- name: nginx
image: linuxserver/nginx
ports:
- containerPort: 80
name: "nginx-http"
文件说明
:
-
apiVersion
和
kind
:指定 API 版本和部署类型,这里是 Pod。
-
metadata
:设置 Pod 的名称和标签。
-
spec
:指定要运行的容器及其配置。
假设将 YAML 文件命名为
pod.yml
,在控制器节点上使用以下命令部署容器:
kubectl apply -f pod.yml
8. 检查容器状态
使用以下命令检查容器部署状态:
kubectl get pods
若要查看更多信息,可添加
-o wide
选项:
kubectl get pods -o wide
9. 访问容器应用
使用 Pod 的 IP 地址访问容器内运行的应用:
curl 10.244.1.2
若
curl
命令不可用,可先安装:
sudo apt install curl
10. 创建 NodePort 服务
为了让外部设备能够访问集群内的应用,创建 NodePort 服务:
apiVersion: v1
kind: Service
metadata:
name: nginx-example
spec:
type: NodePort
ports:
- name: http
port: 80
nodePort: 30080
targetPort: nginx-http
selector:
app: nginx
文件说明
:
-
kind
:指定为 Service。
-
type
:设置为 NodePort。
-
ports
:将 Pod 内的端口 80 映射到集群节点的端口 30080。
-
selector
:选择要暴露的 Pod。
假设将 YAML 文件命名为
service-nodeport.yml
,使用以下命令部署服务:
kubectl apply -f service-nodeport.yml
11. 验证服务状态
使用以下命令检查服务状态:
kubectl get service
在局域网内的机器上,使用浏览器访问控制器节点或工作节点的 IP 地址和端口 30080,即可看到 NGINX 的默认页面。
流程图
graph LR
A[前置准备] --> B[安装 Kubernetes]
B --> C[初始化集群]
C --> D[部署覆盖网络]
D --> E[加入工作节点]
E --> F[验证节点状态]
F --> G[部署容器]
G --> H[检查容器状态]
H --> I[访问容器应用]
I --> J[创建 NodePort 服务]
J --> K[验证服务状态]
通过以上步骤,你可以成功搭建 Kubernetes 集群并部署容器,同时实现外部设备对集群内应用的访问。
Kubernetes 集群搭建与容器部署全攻略
12. 深入理解 NodePort 服务
NodePort 服务是一种将 Kubernetes Pod 内部端口暴露到集群节点端口的方式,它允许外部设备通过集群节点的 IP 和指定的 NodePort 访问 Pod 中的应用。以下是 NodePort 服务的一些关键特性和注意事项:
-
端口范围
:NodePort 服务使用的端口范围是 30000 - 32767。在创建服务时,需要在这个范围内选择一个未被使用的端口。
-
集群范围
:NodePort 服务的端口映射是集群范围的,这意味着可以使用任何集群节点的 IP 地址和 NodePort 访问 Pod 中的应用。
-
安全性
:由于 NodePort 服务将端口暴露到了外部网络,因此需要注意安全性。建议在防火墙中限制对 NodePort 的访问,只允许特定的 IP 地址或网段访问。
13. 服务发现与负载均衡
在 Kubernetes 集群中,服务发现和负载均衡是非常重要的功能。Kubernetes 提供了内置的服务发现机制,通过 DNS 解析来实现。当创建一个服务时,Kubernetes 会为其分配一个 DNS 名称,其他 Pod 可以通过该名称访问服务。
例如,在前面创建的
nginx-example
服务中,可以通过
nginx-example
这个 DNS 名称访问该服务。以下是一个简单的示例,展示如何在另一个 Pod 中使用 DNS 名称访问
nginx-example
服务:
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: test-container
image: busybox
command: ['sh', '-c', 'wget -O - http://nginx-example']
在这个示例中,
test-pod
中的
test-container
会尝试通过
http://nginx-example
访问
nginx-example
服务。
14. 持久化存储
在实际应用中,很多应用需要持久化存储来保存数据。Kubernetes 提供了多种持久化存储解决方案,如 PersistentVolume(PV)和 PersistentVolumeClaim(PVC)。
以下是一个简单的示例,展示如何创建一个 PV 和 PVC:
# 创建 PersistentVolume
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /data/my-pv
# 创建 PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
在创建 PV 和 PVC 后,可以将 PVC 挂载到 Pod 中,实现数据的持久化存储:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx
volumeMounts:
- name: my-volume
mountPath: /data
volumes:
- name: my-volume
persistentVolumeClaim:
claimName: my-pvc
15. 滚动更新与回滚
Kubernetes 支持滚动更新和回滚功能,这使得在更新应用时可以平滑过渡,减少对用户的影响。以下是一个简单的示例,展示如何进行滚动更新和回滚:
# 创建一个 Deployment
kubectl create deployment nginx-deployment --image=nginx:1.14.2
# 进行滚动更新,将镜像版本更新为 1.16.1
kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1
# 查看滚动更新状态
kubectl rollout status deployment/nginx-deployment
# 回滚到上一个版本
kubectl rollout undo deployment/nginx-deployment
16. 监控与日志
为了确保 Kubernetes 集群的稳定运行,需要对集群进行监控和日志管理。以下是一些常用的监控和日志工具:
-
Prometheus
:用于收集和存储指标数据。
-
Grafana
:用于可视化监控数据。
-
Elasticsearch + Logstash + Kibana(ELK)
:用于收集、存储和分析日志数据。
以下是一个简单的示例,展示如何使用 Prometheus 和 Grafana 监控 Kubernetes 集群:
1.
安装 Prometheus
:可以使用 Helm 安装 Prometheus:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install prometheus prometheus-community/kube-prometheus-stack
- 安装 Grafana :同样使用 Helm 安装 Grafana:
helm repo add grafana https://grafana.github.io/helm-charts
helm install grafana grafana/grafana
- 配置 Grafana :登录 Grafana 控制台,添加 Prometheus 数据源,并导入 Kubernetes 相关的仪表盘模板。
17. 总结
通过以上步骤,我们详细介绍了 Kubernetes 集群的搭建、容器部署、服务管理、持久化存储、滚动更新、监控与日志等方面的内容。Kubernetes 是一个强大的容器编排平台,它提供了丰富的功能和工具,帮助我们更高效地管理和部署应用。
在实际应用中,还需要根据具体的需求和场景进行进一步的优化和调整。例如,根据应用的负载情况调整资源分配,根据安全需求配置网络策略等。
总结表格
| 功能 | 描述 | 命令示例 |
|---|---|---|
| 服务发现 | 通过 DNS 解析实现服务发现 | 在 Pod 中使用服务的 DNS 名称访问服务 |
| 持久化存储 | 使用 PV 和 PVC 实现持久化存储 |
kubectl create -f pv.yaml
和
kubectl create -f pvc.yaml
|
| 滚动更新 | 平滑更新应用版本 |
kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1
|
| 回滚 | 回滚到上一个应用版本 |
kubectl rollout undo deployment/nginx-deployment
|
| 监控与日志 | 使用 Prometheus 和 Grafana 监控集群 |
helm install prometheus prometheus-community/kube-prometheus-stack
和
helm install grafana grafana/grafana
|
流程图
graph LR
A[深入理解 NodePort 服务] --> B[服务发现与负载均衡]
B --> C[持久化存储]
C --> D[滚动更新与回滚]
D --> E[监控与日志]
E --> F[总结]
通过以上的步骤和介绍,你可以全面掌握 Kubernetes 集群的搭建和管理,为实际应用提供坚实的基础。
超级会员免费看
2万+

被折叠的 条评论
为什么被折叠?



