活动公告

系统通知
05-18 21:22
系统通知
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

深入浅出Kubernetes应用程序编排实战详解核心概念与操作步骤轻松部署管理容器化应用提升运维效率成为k8s高手

SunJu_FaceMall

3万

主题

2860

科技点

3万

积分

白金月票

碾压王

积分
32872

塔罗立华奏

<font color=白金月票" /> 发表于 2025-9-14 19:00:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1. Kubernetes简介

Kubernetes(简称K8s)是一个开源的容器编排平台,用于自动化容器化应用程序的部署、扩展和管理。它最初由Google设计并捐赠给Cloud Native Computing Foundation(CNCF)来维护。Kubernetes提供了容器编排、服务发现、负载均衡、自动扩缩容、滚动更新等强大功能,使得容器化应用的部署和管理变得简单高效。

1.1 为什么需要Kubernetes

在微服务架构和DevOps实践中,容器化技术(如Docker)已经成为标准。然而,随着容器数量的增加,手动管理这些容器变得异常复杂。Kubernetes解决了以下问题:

• 服务发现和负载均衡:Kubernetes可以使用DNS名称或自己的IP地址公开容器,如果到容器的流量很大,Kubernetes可以负载均衡并分配网络流量,从而使部署稳定。
• 存储编排:Kubernetes允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。
• 自动部署和回滚:你可以描述Kubernetes中已部署容器的所需状态,它可以以受控的速率将实际状态更改为所需状态。例如,你可以自动化Kubernetes来为你的部署创建新容器,删除现有容器并将它们的所有资源用于新容器。
• 自动二进制打包:Kubernetes允许你指定每个容器所需CPU和内存(RAM)。当容器指定了资源请求时,Kubernetes可以做出更好的决策来管理容器的资源。
• 自我修复:Kubernetes重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。
• 密钥与配置管理:Kubernetes允许你存储和管理敏感信息,例如密码、OAuth令牌和ssh密钥。你可以部署和更新密钥和应用程序配置,而无需重新构建容器映像,也无需在堆栈配置中暴露密钥。

2. Kubernetes核心概念

2.1 Pod

Pod是Kubernetes中最小的可部署单元,一个Pod包含一个或多个紧密关联的容器。Pod中的容器共享网络命名空间和存储卷,它们可以通过localhost互相通信。

Pod示例YAML文件:
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: nginx-pod
  5.   labels:
  6.     app: nginx
  7. spec:
  8.   containers:
  9.   - name: nginx
  10.     image: nginx:1.14.2
  11.     ports:
  12.     - containerPort: 80
复制代码

创建Pod的命令:
  1. kubectl apply -f nginx-pod.yaml
复制代码

2.2 Deployment

Deployment是Kubernetes中用于管理Pod副本的控制器,它提供了声明式的更新方式。你可以描述Deployment的目标状态,Deployment控制器会以受控的速率将实际状态更改为期望状态。

Deployment示例YAML文件:
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: nginx-deployment
  5.   labels:
  6.     app: nginx
  7. spec:
  8.   replicas: 3
  9.   selector:
  10.     matchLabels:
  11.       app: nginx
  12.   template:
  13.     metadata:
  14.       labels:
  15.         app: nginx
  16.     spec:
  17.       containers:
  18.       - name: nginx
  19.         image: nginx:1.14.2
  20.         ports:
  21.         - containerPort: 80
复制代码

创建Deployment的命令:
  1. kubectl apply -f nginx-deployment.yaml
复制代码

2.3 Service

Service是Kubernetes中用于将一组Pod暴露为网络服务的抽象。它定义了一组Pod的逻辑集合以及访问它们的策略(有时称为微服务)。Service的目标是使Pod之间的通信更加稳定,因为Pod的IP地址可能会变化。

Service示例YAML文件:
  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4.   name: nginx-service
  5. spec:
  6.   selector:
  7.     app: nginx
  8.   ports:
  9.     - protocol: TCP
  10.       port: 80
  11.       targetPort: 80
  12.   type: LoadBalancer
复制代码

创建Service的命令:
  1. kubectl apply -f nginx-service.yaml
复制代码

2.4 Namespace

Namespace是Kubernetes中用于将集群划分为多个虚拟集群的机制。它允许在同一物理集群中运行多个环境(如开发、测试、生产),而不会相互干扰。

Namespace示例YAML文件:
  1. apiVersion: v1
  2. kind: Namespace
  3. metadata:
  4.   name: development
复制代码

创建Namespace的命令:
  1. kubectl apply -f development-namespace.yaml
复制代码

2.5 ConfigMap和Secret

ConfigMap用于存储非机密的配置数据,而Secret用于存储敏感数据,如密码、OAuth令牌和SSH密钥。

ConfigMap示例YAML文件:
  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4.   name: app-config
  5. data:
  6.   APP_COLOR: blue
  7.   APP_MODE: production
复制代码

Secret示例YAML文件:
  1. apiVersion: v1
  2. kind: Secret
  3. metadata:
  4.   name: app-secret
  5. type: Opaque
  6. data:
  7.   # echo -n 'admin' | base64
  8.   username: YWRtaW4=
  9.   # echo -n 'password' | base64
  10.   password: cGFzc3dvcmQ=
复制代码

创建ConfigMap和Secret的命令:
  1. kubectl apply -f app-config.yaml
  2. kubectl apply -f app-secret.yaml
复制代码

2.6 Volume

Volume是Kubernetes中用于Pod中容器之间共享数据以及持久化数据的机制。Kubernetes支持多种类型的Volume,如emptyDir、hostPath、persistentVolumeClaim等。

使用Volume的Pod示例:
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: volume-pod
  5. spec:
  6.   containers:
  7.   - name: nginx
  8.     image: nginx
  9.     volumeMounts:
  10.     - name: html-volume
  11.       mountPath: /usr/share/nginx/html
  12.   volumes:
  13.   - name: html-volume
  14.     emptyDir: {}
复制代码

2.7 PersistentVolume和PersistentVolumeClaim

PersistentVolume(PV)是集群中的一块存储,由管理员配置或使用存储类动态配置。PersistentVolumeClaim(PVC)是用户对存储的请求,类似于Pod对节点的请求。

PersistentVolume示例YAML文件:
  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4.   name: pv-volume
  5. spec:
  6.   capacity:
  7.     storage: 10Gi
  8.   accessModes:
  9.     - ReadWriteOnce
  10.   persistentVolumeReclaimPolicy: Retain
  11.   hostPath:
  12.     path: /data/pv-volume
复制代码

PersistentVolumeClaim示例YAML文件:
  1. apiVersion: v1
  2. kind: PersistentVolumeClaim
  3. metadata:
  4.   name: pv-claim
  5. spec:
  6.   accessModes:
  7.     - ReadWriteOnce
  8.   resources:
  9.     requests:
  10.       storage: 3Gi
复制代码

创建PV和PVC的命令:
  1. kubectl apply -f pv.yaml
  2. kubectl apply -f pvc.yaml
复制代码

2.8 Ingress

Ingress是Kubernetes中用于管理外部访问集群中服务的API对象,通常用于暴露HTTP和HTTPS路由。Ingress可以提供负载均衡、SSL终止和基于名称的虚拟主机等功能。

Ingress示例YAML文件:
  1. apiVersion: networking.k8s.io/v1
  2. kind: Ingress
  3. metadata:
  4.   name: nginx-ingress
  5.   annotations:
  6.     nginx.ingress.kubernetes.io/rewrite-target: /
  7. spec:
  8.   rules:
  9.   - host: example.com
  10.     http:
  11.       paths:
  12.       - path: /
  13.         pathType: Prefix
  14.         backend:
  15.           service:
  16.             name: nginx-service
  17.             port:
  18.               number: 80
复制代码

创建Ingress的命令:
  1. kubectl apply -f nginx-ingress.yaml
复制代码

3. Kubernetes集群架构

Kubernetes集群由多个组件组成,这些组件分为控制平面组件(Control Plane Components)和工作节点组件(Node Components)。

3.1 控制平面组件

控制平面组件负责管理集群的全局状态,做出全局决策,以及检测和响应集群事件。

kube-apiserver是Kubernetes控制平面的前端,它暴露了Kubernetes API。它是集群控制平面的入口,负责处理RESTful操作,验证和更新API对象的状态。

etcd是Kubernetes的键值存储,用于持久化存储集群的所有状态信息。etcd是分布式且高可用的,是Kubernetes集群的”唯一数据源”。

kube-scheduler负责监视新创建的、尚未分配节点的Pod,并选择节点让Pod在上面运行。调度决策考虑的因素包括资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据位置、工作负载间干扰和最后期限等。

kube-controller-manager运行控制器进程,这些控制器负责在集群中运行常规任务。从逻辑上讲,每个控制器都是一个单独的进程,但为了降低复杂性,它们都被编译到同一个可执行文件中,并在一个进程中运行。

cloud-controller-manager是Kubernetes与云平台交互的组件,它允许你将集群连接到云提供商的API,并将与云平台交互的组件与与集群交互的组件分离。

3.2 工作节点组件

工作节点组件在每个节点上运行,负责维护运行的Pod并提供Kubernetes运行环境。

kubelet是在每个节点上运行的主要”节点代理”。它确保容器在Pod中运行。kubelet接收一组通过多种机制提供给它的PodSpec,并确保这些PodSpec中描述的容器处于健康状态。

kube-proxy是集群中每个节点上运行的网络代理,实现了Kubernetes Service概念的一部分。kube-proxy维护节点上的网络规则,这些规则允许与Pods的网络通信。

容器运行时是负责运行容器的软件,例如Docker、containerd或CRI-O。kubelet通过容器运行时接口(CRI)与容器运行时交互,以管理容器的生命周期。

4. 安装和设置Kubernetes集群

4.1 使用Minikube安装单节点集群

Minikube是一个工具,可以在本地快速运行单节点Kubernetes集群,适合学习和开发。

安装Minikube:

在Linux上:
  1. curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
  2. sudo install minikube-linux-amd64 /usr/local/bin/minikube
复制代码

在macOS上:
  1. curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64
  2. sudo install minikube-darwin-amd64 /usr/local/bin/minikube
复制代码

在Windows上:
  1. curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-windows-amd64.exe
  2. mv minikube-windows-amd64.exe minikube.exe
复制代码

启动Minikube集群:
  1. minikube start
复制代码

检查集群状态:
  1. kubectl cluster-info
复制代码

4.2 使用kubeadm安装多节点集群

kubeadm是Kubernetes官方提供的工具,用于快速部署Kubernetes集群。

在所有节点上安装Docker:
  1. # 更新apt包索引并安装依赖包
  2. sudo apt-get update
  3. sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
  4. # 添加Docker的官方GPG密钥
  5. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  6. # 添加Docker的稳定版仓库
  7. sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  8. # 安装Docker
  9. sudo apt-get update
  10. sudo apt-get install -y docker-ce docker-ce-cli containerd.io
  11. # 配置Docker使用systemd作为cgroup驱动
  12. sudo mkdir -p /etc/docker
  13. cat <<EOF | sudo tee /etc/docker/daemon.json
  14. {
  15.   "exec-opts": ["native.cgroupdriver=systemd"],
  16.   "log-driver": "json-file",
  17.   "log-opts": {
  18.     "max-size": "100m"
  19.   },
  20.   "storage-driver": "overlay2"
  21. }
  22. EOF
  23. # 重启Docker
  24. sudo systemctl enable docker
  25. sudo systemctl daemon-reload
  26. sudo systemctl restart docker
复制代码

在所有节点上安装kubeadm、kubelet和kubectl:
  1. # 添加Kubernetes的apt仓库
  2. sudo apt-get update && sudo apt-get install -y apt-transport-https curl
  3. curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
  4. cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
  5. deb https://apt.kubernetes.io/ kubernetes-xenial main
  6. EOF
  7. # 安装kubeadm、kubelet和kubectl
  8. sudo apt-get update
  9. sudo apt-get install -y kubelet kubeadm kubectl
  10. sudo apt-mark hold kubelet kubeadm kubectl
  11. # 禁用swap
  12. sudo swapoff -a
  13. sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
复制代码

在主节点上初始化集群:
  1. sudo kubeadm init --pod-network-cidr=10.244.0.0/16
复制代码

初始化成功后,记录下kubeadm join命令,用于将工作节点加入集群。

配置kubectl:
  1. mkdir -p $HOME/.kube
  2. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  3. sudo chown $(id -u):$(id -g) $HOME/.kube/config
复制代码

安装网络插件(如Flannel):
  1. kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
复制代码

在工作节点上加入集群:
  1. sudo kubeadm join <master-ip>:<master-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
复制代码

验证集群状态:
  1. kubectl get nodes
复制代码

5. 部署容器化应用

5.1 创建Docker镜像

在部署应用到Kubernetes之前,首先需要将应用打包成Docker镜像。

示例Dockerfile:
  1. # 使用官方Node.js运行时作为基础镜像
  2. FROM node:14
  3. # 设置工作目录
  4. WORKDIR /app
  5. # 复制package.json和package-lock.json
  6. COPY package*.json ./
  7. # 安装应用依赖
  8. RUN npm install
  9. # 复制应用代码
  10. COPY . .
  11. # 暴露应用端口
  12. EXPOSE 3000
  13. # 定义启动命令
  14. CMD [ "node", "app.js" ]
复制代码

构建Docker镜像:
  1. docker build -t my-node-app .
复制代码

将镜像推送到镜像仓库:
  1. docker tag my-node-app username/my-node-app:v1
  2. docker push username/my-node-app:v1
复制代码

5.2 使用Deployment部署应用

Deployment YAML文件示例:
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: node-app-deployment
  5.   labels:
  6.     app: node-app
  7. spec:
  8.   replicas: 3
  9.   selector:
  10.     matchLabels:
  11.       app: node-app
  12.   template:
  13.     metadata:
  14.       labels:
  15.         app: node-app
  16.     spec:
  17.       containers:
  18.       - name: node-app
  19.         image: username/my-node-app:v1
  20.         ports:
  21.         - containerPort: 3000
  22.         env:
  23.         - name: NODE_ENV
  24.           value: "production"
  25.         resources:
  26.           requests:
  27.             memory: "64Mi"
  28.             cpu: "250m"
  29.           limits:
  30.             memory: "128Mi"
  31.             cpu: "500m"
  32.         livenessProbe:
  33.           httpGet:
  34.             path: /
  35.             port: 3000
  36.           initialDelaySeconds: 15
  37.           periodSeconds: 20
  38.         readinessProbe:
  39.           httpGet:
  40.             path: /
  41.             port: 3000
  42.           initialDelaySeconds: 5
  43.           periodSeconds: 10
复制代码

创建Deployment:
  1. kubectl apply -f node-app-deployment.yaml
复制代码

5.3 暴露应用服务

Service YAML文件示例:
  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4.   name: node-app-service
  5. spec:
  6.   selector:
  7.     app: node-app
  8.   ports:
  9.     - protocol: TCP
  10.       port: 80
  11.       targetPort: 3000
  12.   type: LoadBalancer
复制代码

创建Service:
  1. kubectl apply -f node-app-service.yaml
复制代码

5.4 使用Ingress暴露应用

Ingress YAML文件示例:
  1. apiVersion: networking.k8s.io/v1
  2. kind: Ingress
  3. metadata:
  4.   name: node-app-ingress
  5.   annotations:
  6.     nginx.ingress.kubernetes.io/rewrite-target: /
  7. spec:
  8.   rules:
  9.   - host: node-app.example.com
  10.     http:
  11.       paths:
  12.       - path: /
  13.         pathType: Prefix
  14.         backend:
  15.           service:
  16.             name: node-app-service
  17.             port:
  18.               number: 80
复制代码

创建Ingress:
  1. kubectl apply -f node-app-ingress.yaml
复制代码

6. 管理和扩展应用

6.1 扩展应用

手动扩展Deployment:
  1. kubectl scale deployment node-app-deployment --replicas=5
复制代码

自动扩展(Horizontal Pod Autoscaler):
  1. apiVersion: autoscaling/v2beta2
  2. kind: HorizontalPodAutoscaler
  3. metadata:
  4.   name: node-app-hpa
  5. spec:
  6.   scaleTargetRef:
  7.     apiVersion: apps/v1
  8.     kind: Deployment
  9.     name: node-app-deployment
  10.   minReplicas: 3
  11.   maxReplicas: 10
  12.   metrics:
  13.   - type: Resource
  14.     resource:
  15.       name: cpu
  16.       target:
  17.         type: Utilization
  18.         averageUtilization: 50
  19.   - type: Resource
  20.     resource:
  21.       name: memory
  22.       target:
  23.         type: Utilization
  24.         averageUtilization: 80
复制代码

创建HPA:
  1. kubectl apply -f node-app-hpa.yaml
复制代码

6.2 滚动更新

更新Deployment的镜像版本:
  1. kubectl set image deployment/node-app-deployment node-app=username/my-node-app:v2
复制代码

或者直接编辑Deployment:
  1. kubectl edit deployment node-app-deployment
复制代码

查看更新状态:
  1. kubectl rollout status deployment/node-app-deployment
复制代码

回滚到上一个版本:
  1. kubectl rollout undo deployment/node-app-deployment
复制代码

查看更新历史:
  1. kubectl rollout history deployment/node-app-deployment
复制代码

6.3 蓝绿部署

蓝绿部署是一种减少停机时间的部署策略,它通过维护两个相同的生产环境(蓝色和绿色)来实现。在任何时候,只有一个环境是活动的。

蓝绿部署示例:

1. 首先创建绿色环境的Deployment:
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: node-app-deployment-green
  5.   labels:
  6.     app: node-app
  7.     version: green
  8. spec:
  9.   replicas: 3
  10.   selector:
  11.     matchLabels:
  12.       app: node-app
  13.       version: green
  14.   template:
  15.     metadata:
  16.       labels:
  17.         app: node-app
  18.         version: green
  19.     spec:
  20.       containers:
  21.       - name: node-app
  22.         image: username/my-node-app:v2
  23.         ports:
  24.         - containerPort: 3000
复制代码

1. 创建绿色环境的Service:
  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4.   name: node-app-service-green
  5. spec:
  6.   selector:
  7.     app: node-app
  8.     version: green
  9.   ports:
  10.     - protocol: TCP
  11.       port: 80
  12.       targetPort: 3000
  13.   type: LoadBalancer
复制代码

1. 测试绿色环境,确保一切正常。
2. 更新Ingress,将流量从蓝色环境切换到绿色环境:

测试绿色环境,确保一切正常。

更新Ingress,将流量从蓝色环境切换到绿色环境:
  1. apiVersion: networking.k8s.io/v1
  2. kind: Ingress
  3. metadata:
  4.   name: node-app-ingress
  5.   annotations:
  6.     nginx.ingress.kubernetes.io/rewrite-target: /
  7. spec:
  8.   rules:
  9.   - host: node-app.example.com
  10.     http:
  11.       paths:
  12.       - path: /
  13.         pathType: Prefix
  14.         backend:
  15.           service:
  16.             name: node-app-service-green
  17.             port:
  18.               number: 80
复制代码

1. 确认流量已切换到绿色环境后,可以删除蓝色环境。

6.4 金丝雀发布

金丝雀发布是一种逐步将流量从旧版本切换到新版本的策略,可以降低发布风险。

金丝雀发布示例:

1. 创建新版本的Deployment:
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: node-app-deployment-v2
  5.   labels:
  6.     app: node-app
  7.     version: v2
  8. spec:
  9.   replicas: 1
  10.   selector:
  11.     matchLabels:
  12.       app: node-app
  13.       version: v2
  14.   template:
  15.     metadata:
  16.       labels:
  17.         app: node-app
  18.         version: v2
  19.     spec:
  20.       containers:
  21.       - name: node-app
  22.         image: username/my-node-app:v2
  23.         ports:
  24.         - containerPort: 3000
复制代码

1. 创建新版本的Service:
  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4.   name: node-app-service-v2
  5. spec:
  6.   selector:
  7.     app: node-app
  8.     version: v2
  9.   ports:
  10.     - protocol: TCP
  11.       port: 80
  12.       targetPort: 3000
  13.   type: LoadBalancer
复制代码

1. 使用Ingress或Service Mesh(如Istio)来控制流量分配。以下是使用Ingress的示例:
  1. apiVersion: networking.k8s.io/v1
  2. kind: Ingress
  3. metadata:
  4.   name: node-app-ingress
  5.   annotations:
  6.     nginx.ingress.kubernetes.io/rewrite-target: /
  7.     nginx.ingress.kubernetes.io/canary: "true"
  8.     nginx.ingress.kubernetes.io/canary-weight: "10"
  9. spec:
  10.   rules:
  11.   - host: node-app.example.com
  12.     http:
  13.       paths:
  14.       - path: /
  15.         pathType: Prefix
  16.         backend:
  17.           service:
  18.             name: node-app-service-v2
  19.             port:
  20.               number: 80
复制代码

1. 逐步增加新版本的流量比例,直到所有流量都切换到新版本。
2. 确认新版本稳定后,可以删除旧版本。

逐步增加新版本的流量比例,直到所有流量都切换到新版本。

确认新版本稳定后,可以删除旧版本。

7. 配置管理和密钥管理

7.1 使用ConfigMap管理配置

ConfigMap允许你将配置数据与容器镜像解耦,从而使应用程序更具可移植性。

创建ConfigMap:
  1. kubectl create configmap app-config --from-file=config.properties
复制代码

或者使用YAML文件:
  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4.   name: app-config
  5. data:
  6.   config.properties: |
  7.     database.url=jdbc:mysql://db.example.com:3306/mydb
  8.     database.username=admin
  9.     database.password=password
  10.     app.theme=dark
  11.     app.feature.enabled=true
复制代码

在Pod中使用ConfigMap:

1. 作为环境变量:
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: configmap-pod
  5. spec:
  6.   containers:
  7.     - name: my-app
  8.       image: my-app-image
  9.       envFrom:
  10.         - configMapRef:
  11.             name: app-config
复制代码

1. 作为卷挂载:
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: configmap-volume-pod
  5. spec:
  6.   containers:
  7.     - name: my-app
  8.       image: my-app-image
  9.       volumeMounts:
  10.         - name: config-volume
  11.           mountPath: /etc/config
  12.   volumes:
  13.     - name: config-volume
  14.       configMap:
  15.         name: app-config
复制代码

7.2 使用Secret管理敏感数据

Secret用于存储敏感数据,如密码、OAuth令牌和SSH密钥。

创建Secret:
  1. kubectl create secret generic db-secret --from-literal=username=admin --from-literal=password=password
复制代码

或者使用YAML文件:
  1. apiVersion: v1
  2. kind: Secret
  3. metadata:
  4.   name: db-secret
  5. type: Opaque
  6. data:
  7.   username: YWRtaW4=  # base64编码的"admin"
  8.   password: cGFzc3dvcmQ=  # base64编码的"password"
复制代码

在Pod中使用Secret:

1. 作为环境变量:
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: secret-pod
  5. spec:
  6.   containers:
  7.     - name: my-app
  8.       image: my-app-image
  9.       env:
  10.         - name: DB_USERNAME
  11.           valueFrom:
  12.             secretKeyRef:
  13.               name: db-secret
  14.               key: username
  15.         - name: DB_PASSWORD
  16.           valueFrom:
  17.             secretKeyRef:
  18.               name: db-secret
  19.               key: password
复制代码

1. 作为卷挂载:
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: secret-volume-pod
  5. spec:
  6.   containers:
  7.     - name: my-app
  8.       image: my-app-image
  9.       volumeMounts:
  10.         - name: secret-volume
  11.           mountPath: "/etc/secret"
  12.           readOnly: true
  13.   volumes:
  14.     - name: secret-volume
  15.       secret:
  16.         secretName: db-secret
复制代码

7.3 使用Helm管理应用配置

Helm是Kubernetes的包管理器,它允许你定义、安装和升级复杂的Kubernetes应用。

安装Helm:

在Linux上:
  1. curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
  2. echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
  3. sudo apt-get update
  4. sudo apt-get install helm
复制代码

在macOS上:
  1. brew install helm
复制代码

创建Helm Chart:
  1. helm create my-chart
复制代码

Chart目录结构:
  1. my-chart/
  2.   Chart.yaml          # Chart的元数据
  3.   values.yaml         # Chart的默认配置值
  4.   charts/             # 依赖的Chart
  5.   templates/          # 模板文件
  6.     NOTES.txt         # 安装后说明
  7.     deployment.yaml   # Deployment模板
  8.     service.yaml      # Service模板
  9.     ingress.yaml      # Ingress模板
  10.     _helpers.tpl      # 模板助手
复制代码

自定义values.yaml示例:
  1. replicaCount: 3
  2. image:
  3.   repository: username/my-node-app
  4.   pullPolicy: IfNotPresent
  5.   tag: "v1"
  6. service:
  7.   type: LoadBalancer
  8.   port: 80
  9.   targetPort: 3000
  10. ingress:
  11.   enabled: true
  12.   annotations:
  13.     nginx.ingress.kubernetes.io/rewrite-target: /
  14.   hosts:
  15.     - host: node-app.example.com
  16.       paths: ["/"]
  17. resources:
  18.   limits:
  19.     cpu: 500m
  20.     memory: 128Mi
  21.   requests:
  22.     cpu: 250m
  23.     memory: 64Mi
复制代码

部署Helm Chart:
  1. helm install my-release ./my-chart
复制代码

升级Helm Release:
  1. helm upgrade my-release ./my-chart
复制代码

回滚Helm Release:
  1. helm rollback my-release 1
复制代码

8. 网络配置

8.1 Kubernetes网络模型

Kubernetes网络模型要求所有Pod可以在不使用NAT的情况下相互通信,并且所有节点可以在不使用NAT的情况下与所有Pod通信。为了实现这一点,Kubernetes提供了多种网络插件,如Flannel、Calico、Weave Net等。

8.2 安装网络插件

安装Flannel:
  1. kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
复制代码

安装Calico:
  1. kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
复制代码

8.3 网络策略

网络策略允许你控制Pod之间的网络流量,实现微服务之间的隔离。

网络策略示例:
  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4.   name: backend-network-policy
  5.   namespace: default
  6. spec:
  7.   podSelector:
  8.     matchLabels:
  9.       app: backend
  10.   policyTypes:
  11.   - Ingress
  12.   - Egress
  13.   ingress:
  14.   - from:
  15.     - podSelector:
  16.         matchLabels:
  17.           app: frontend
  18.     ports:
  19.     - protocol: TCP
  20.       port: 8080
  21.   egress:
  22.   - to:
  23.     - podSelector:
  24.         matchLabels:
  25.           app: database
  26.     ports:
  27.     - protocol: TCP
  28.       port: 3306
复制代码

创建网络策略:
  1. kubectl apply -f backend-network-policy.yaml
复制代码

8.4 Service Mesh

Service Mesh是一种用于处理服务间通信的基础设施层,它提供了可靠的服务间通信、负载均衡、服务发现、故障恢复、度量和监控等功能。Istio是一个流行的Service Mesh实现。

安装Istio:
  1. # 下载Istio
  2. curl -L https://istio.io/downloadIstio | sh -
  3. # 进入Istio目录
  4. cd istio-*
  5. # 添加istioctl到PATH
  6. export PATH=$PWD/bin:$PATH
  7. # 安装Istio
  8. istioctl install --set profile=demo
复制代码

为命名空间启用Istio注入:
  1. kubectl label namespace default istio-injection=enabled
复制代码

部署应用:
  1. kubectl apply -f node-app-deployment.yaml
复制代码

创建Gateway和VirtualService:
  1. apiVersion: networking.istio.io/v1alpha3
  2. kind: Gateway
  3. metadata:
  4.   name: node-app-gateway
  5. spec:
  6.   selector:
  7.     istio: ingressgateway
  8.   servers:
  9.   - port:
  10.       number: 80
  11.       name: http
  12.       protocol: HTTP
  13.     hosts:
  14.     - "node-app.example.com"
  15. ---
  16. apiVersion: networking.istio.io/v1alpha3
  17. kind: VirtualService
  18. metadata:
  19.   name: node-app-virtualservice
  20. spec:
  21.   hosts:
  22.   - "node-app.example.com"
  23.   gateways:
  24.   - node-app-gateway
  25.   http:
  26.   - route:
  27.     - destination:
  28.         host: node-app-service
  29.         port:
  30.           number: 80
复制代码

创建Gateway和VirtualService:
  1. kubectl apply -f istio-gateway.yaml
复制代码

9. 存储管理

9.1 Volume类型

Kubernetes支持多种Volume类型,包括:

• emptyDir:一个临时的空目录,生命周期与Pod相同。
• hostPath:将主机节点的文件系统中的文件或目录挂载到Pod中。
• persistentVolumeClaim:使用持久卷声明来挂载存储。
• configMap、secret、downwardAPI:特殊类型的卷,用于将Kubernetes资源暴露给Pod。
• CSI(容器存储接口):允许第三方存储供应商编写代码来暴露新的存储系统。

9.2 使用PersistentVolume和PersistentVolumeClaim

PersistentVolume示例:
  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4.   name: nfs-pv
  5. spec:
  6.   capacity:
  7.     storage: 10Gi
  8.   accessModes:
  9.     - ReadWriteMany
  10.   persistentVolumeReclaimPolicy: Retain
  11.   nfs:
  12.     path: /data/nfs
  13.     server: nfs-server.example.com
复制代码

PersistentVolumeClaim示例:
  1. apiVersion: v1
  2. kind: PersistentVolumeClaim
  3. metadata:
  4.   name: nfs-pvc
  5. spec:
  6.   accessModes:
  7.     - ReadWriteMany
  8.   resources:
  9.     requests:
  10.       storage: 5Gi
复制代码

在Pod中使用PVC:
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: nfs-pod
  5. spec:
  6.   containers:
  7.     - name: nfs-container
  8.       image: nginx
  9.       volumeMounts:
  10.         - name: nfs-volume
  11.           mountPath: /usr/share/nginx/html
  12.   volumes:
  13.     - name: nfs-volume
  14.       persistentVolumeClaim:
  15.         claimName: nfs-pvc
复制代码

9.3 StorageClass

StorageClass允许管理员定义存储的”类”,不同的类可能映射到不同的服务质量级别、备份策略或由集群管理员确定的任意策略。

StorageClass示例:
  1. apiVersion: storage.k8s.io/v1
  2. kind: StorageClass
  3. metadata:
  4.   name: fast-ssd
  5. provisioner: kubernetes.io/gce-pd
  6. parameters:
  7.   type: pd-ssd
复制代码

使用StorageClass的PVC:
  1. apiVersion: v1
  2. kind: PersistentVolumeClaim
  3. metadata:
  4.   name: fast-ssd-pvc
  5. spec:
  6.   accessModes:
  7.     - ReadWriteOnce
  8.   storageClassName: fast-ssd
  9.   resources:
  10.     requests:
  11.       storage: 10Gi
复制代码

9.4 动态卷配置

动态卷配置允许StorageClass根据需要自动创建PersistentVolume。要使用动态卷配置,你需要:

1. 确保集群中有一个支持动态配置的存储插件。
2. 创建一个StorageClass,定义如何配置卷。
3. 创建一个PersistentVolumeClaim,引用该StorageClass。

示例:
  1. apiVersion: v1
  2. kind: PersistentVolumeClaim
  3. metadata:
  4.   name: dynamic-pvc
  5. spec:
  6.   accessModes:
  7.     - ReadWriteOnce
  8.   storageClassName: fast-ssd  # 引用StorageClass
  9.   resources:
  10.     requests:
  11.       storage: 10Gi
复制代码

10. 监控和日志

10.1 使用Prometheus和Grafana进行监控

Prometheus是一个开源的监控和告警系统,特别适合于Kubernetes环境。Grafana是一个开源的度量分析和可视化套件。

安装Prometheus Operator:
  1. kubectl create namespace monitoring
  2. helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
  3. helm repo update
  4. helm install prometheus prometheus-community/kube-prometheus-stack -n monitoring
复制代码

访问Prometheus UI:
  1. kubectl port-forward -n monitoring svc/prometheus-kube-prometheus-prometheus 9090:9090
复制代码

访问Grafana UI:
  1. kubectl port-forward -n monitoring svc/prometheus-grafana 3000:3000
复制代码

10.2 使用ELK Stack进行日志管理

ELK Stack(Elasticsearch、Logstash和Kibana)是一个流行的日志管理解决方案。

安装Elasticsearch:
  1. apiVersion: apps/v1
  2. kind: StatefulSet
  3. metadata:
  4.   name: elasticsearch
  5.   namespace: logging
  6. spec:
  7.   serviceName: elasticsearch
  8.   replicas: 1
  9.   selector:
  10.     matchLabels:
  11.       app: elasticsearch
  12.   template:
  13.     metadata:
  14.       labels:
  15.         app: elasticsearch
  16.     spec:
  17.       containers:
  18.       - name: elasticsearch
  19.         image: docker.elastic.co/elasticsearch/elasticsearch:7.10.1
  20.         ports:
  21.         - containerPort: 9200
  22.           name: http
  23.         - containerPort: 9300
  24.           name: transport
  25.         env:
  26.         - name: discovery.type
  27.           value: single-node
  28.         - name: ES_JAVA_OPTS
  29.           value: "-Xms512m -Xmx512m"
  30.         volumeMounts:
  31.         - name: data
  32.           mountPath: /usr/share/elasticsearch/data
  33.   volumeClaimTemplates:
  34.   - metadata:
  35.       name: data
  36.     spec:
  37.       accessModes: [ "ReadWriteOnce" ]
  38.       resources:
  39.         requests:
  40.           storage: 10Gi
  41. ---
  42. apiVersion: v1
  43. kind: Service
  44. metadata:
  45.   name: elasticsearch
  46.   namespace: logging
  47. spec:
  48.   ports:
  49.   - port: 9200
  50.     name: http
  51.   selector:
  52.     app: elasticsearch
复制代码

安装Kibana:
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: kibana
  5.   namespace: logging
  6. spec:
  7.   replicas: 1
  8.   selector:
  9.     matchLabels:
  10.       app: kibana
  11.   template:
  12.     metadata:
  13.       labels:
  14.         app: kibana
  15.     spec:
  16.       containers:
  17.       - name: kibana
  18.         image: docker.elastic.co/kibana/kibana:7.10.1
  19.         ports:
  20.         - containerPort: 5601
  21.         env:
  22.         - name: ELASTICSEARCH_HOSTS
  23.           value: http://elasticsearch:9200
  24. ---
  25. apiVersion: v1
  26. kind: Service
  27. metadata:
  28.   name: kibana
  29.   namespace: logging
  30. spec:
  31.   ports:
  32.   - port: 5601
  33.     name: http
  34.   selector:
  35.     app: kibana
复制代码

安装Filebeat(日志收集器):
  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4.   name: filebeat-config
  5.   namespace: logging
  6. data:
  7.   filebeat.yml: |-
  8.     filebeat.inputs:
  9.     - type: container
  10.       paths:
  11.       - /var/log/containers/*.log
  12.       processors:
  13.       - add_kubernetes_metadata:
  14.           host: ${NODE_NAME}
  15.           matchers:
  16.           - logs_path:
  17.               logs_path: "/var/log/containers/"
  18.     output.elasticsearch:
  19.       hosts: ['elasticsearch:9200']
  20. ---
  21. apiVersion: apps/v1
  22. kind: DaemonSet
  23. metadata:
  24.   name: filebeat
  25.   namespace: logging
  26. spec:
  27.   selector:
  28.     matchLabels:
  29.       app: filebeat
  30.   template:
  31.     metadata:
  32.       labels:
  33.         app: filebeat
  34.     spec:
  35.       serviceAccountName: filebeat
  36.       terminationGracePeriodSeconds: 30
  37.       containers:
  38.       - name: filebeat
  39.         image: docker.elastic.co/beats/filebeat:7.10.1
  40.         args: [
  41.           "-c", "/etc/filebeat.yml",
  42.           "-e",
  43.         ]
  44.         env:
  45.         - name: NODE_NAME
  46.           valueFrom:
  47.             fieldRef:
  48.               fieldPath: spec.nodeName
  49.         securityContext:
  50.           runAsUser: 0
  51.         volumeMounts:
  52.         - name: config
  53.           mountPath: /etc/filebeat.yml
  54.           readOnly: true
  55.           subPath: filebeat.yml
  56.         - name: data
  57.           mountPath: /usr/share/filebeat/data
  58.         - name: varlog
  59.           mountPath: /var/log
  60.           readOnly: true
  61.         - name: varlibdockercontainers
  62.           mountPath: /var/lib/docker/containers
  63.           readOnly: true
  64.       volumes:
  65.       - name: config
  66.         configMap:
  67.           defaultMode: 0600
  68.           name: filebeat-config
  69.       - name: data
  70.         hostPath:
  71.           path: /var/lib/filebeat-data
  72.           type: DirectoryOrCreate
  73.       - name: varlog
  74.         hostPath:
  75.           path: /var/log
  76.       - name: varlibdockercontainers
  77.         hostPath:
  78.           path: /var/lib/docker/containers
  79. ---
  80. apiVersion: rbac.authorization.k8s.io/v1
  81. kind: ClusterRole
  82. metadata:
  83.   name: filebeat
  84. rules:
  85. - apiGroups: [""]
  86.   resources:
  87.   - namespaces
  88.   - pods
  89.   verbs:
  90.   - get
  91.   - watch
  92.   - list
  93. ---
  94. apiVersion: v1
  95. kind: ServiceAccount
  96. metadata:
  97.   name: filebeat
  98.   namespace: logging
  99. ---
  100. apiVersion: rbac.authorization.k8s.io/v1
  101. kind: ClusterRoleBinding
  102. metadata:
  103.   name: filebeat
  104. subjects:
  105. - kind: ServiceAccount
  106.   name: filebeat
  107.   namespace: logging
  108. roleRef:
  109.   kind: ClusterRole
  110.   name: filebeat
  111.   apiGroup: rbac.authorization.k8s.io
复制代码

10.3 使用Kubernetes Dashboard

Kubernetes Dashboard是一个基于Web的Kubernetes用户界面。

安装Dashboard:
  1. kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml
复制代码

创建访问Dashboard的ServiceAccount和ClusterRoleBinding:
  1. apiVersion: v1
  2. kind: ServiceAccount
  3. metadata:
  4.   name: admin-user
  5.   namespace: kubernetes-dashboard
  6. ---
  7. apiVersion: rbac.authorization.k8s.io/v1
  8. kind: ClusterRoleBinding
  9. metadata:
  10.   name: admin-user
  11. roleRef:
  12.   apiGroup: rbac.authorization.k8s.io
  13.   kind: ClusterRole
  14.   name: cluster-admin
  15. subjects:
  16. - kind: ServiceAccount
  17.   name: admin-user
  18.   namespace: kubernetes-dashboard
复制代码

获取访问令牌:
  1. kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"
复制代码

访问Dashboard:
  1. kubectl proxy
复制代码

然后在浏览器中访问:http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

11. 故障排除

11.1 常见问题及解决方案

可能原因:

• 集群资源不足
• 节点不可用
• 调度约束(如节点选择器、亲和性/反亲和性规则)无法满足
• 持久卷声明无法绑定

排查步骤:
  1. # 查看Pod详细信息
  2. kubectl describe pod <pod-name>
  3. # 查看节点资源使用情况
  4. kubectl top nodes
  5. # 查看事件
  6. kubectl get events --sort-by=.metadata.creationTimestamp
复制代码

可能原因:

• 应用程序错误
• 配置错误
• 资源限制过低
• 依赖服务不可用

排查步骤:
  1. # 查看Pod日志
  2. kubectl logs <pod-name>
  3. # 查看前一个容器的日志
  4. kubectl logs <pod-name> --previous
  5. # 查看Pod详细信息
  6. kubectl describe pod <pod-name>
  7. # 进入Pod进行调试
  8. kubectl exec -it <pod-name> -- /bin/bash
复制代码

可能原因:

• Service的selector与Pod的标签不匹配
• 网络策略阻止了访问
• 端口配置错误
• kube-proxy问题

排查步骤:
  1. # 查看Service详细信息
  2. kubectl describe service <service-name>
  3. # 查看Service的端点
  4. kubectl get endpoints <service-name>
  5. # 检查Pod标签
  6. kubectl get pods --show-labels
  7. # 在Pod内部测试连接
  8. kubectl exec -it <pod-name> -- wget -qO- <service-name>.<namespace>.svc.cluster.local:<port>
复制代码

11.2 调试工具

kubectl debug是一个强大的调试工具,可以创建调试容器或复制Pod进行调试。

创建调试容器:
  1. kubectl debug -it <pod-name> --image=busybox --target=<container-name> -- /bin/sh
复制代码

复制Pod进行调试:
  1. kubectl debug -it <pod-name> --image=busybox --copy-to=<debug-pod-name> -- /bin/sh
复制代码

创建临时Pod:
  1. kubectl run -it --rm debug-pod --image=busybox -- /bin/sh
复制代码

在临时Pod中,可以使用nslookup、wget、curl等工具测试网络连接。

将Pod端口转发到本地:
  1. kubectl port-forward <pod-name> <local-port>:<pod-port>
复制代码

将Service端口转发到本地:
  1. kubectl port-forward svc/<service-name> <local-port>:<service-port>
复制代码

12. 最佳实践和提升运维效率的技巧

12.1 资源管理最佳实践

为所有容器设置资源请求和限制,以确保集群资源的合理分配和防止资源耗尽。

示例:
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: my-app
  5. spec:
  6.   template:
  7.     spec:
  8.       containers:
  9.       - name: my-app
  10.         image: my-app-image
  11.         resources:
  12.           requests:
  13.             memory: "64Mi"
  14.             cpu: "250m"
  15.           limits:
  16.             memory: "128Mi"
  17.             cpu: "500m"
复制代码

使用ResourceQuota限制命名空间中的资源使用量。

示例:
  1. apiVersion: v1
  2. kind: ResourceQuota
  3. metadata:
  4.   name: compute-resources
  5.   namespace: dev
  6. spec:
  7.   hard:
  8.     requests.cpu: "4"
  9.     requests.memory: 8Gi
  10.     limits.cpu: "10"
  11.     limits.memory: 16Gi
复制代码

使用LimitRange为命名空间中的容器设置默认资源请求和限制。

示例:
  1. apiVersion: v1
  2. kind: LimitRange
  3. metadata:
  4.   name: mem-limit-range
  5.   namespace: dev
  6. spec:
  7.   limits:
  8.   - default:
  9.       memory: 512Mi
  10.     defaultRequest:
  11.       memory: 256Mi
  12.     type: Container
复制代码

12.2 安全最佳实践

使用Role-Based Access Control(RBAC)控制对Kubernetes资源的访问。

示例:
  1. apiVersion: rbac.authorization.k8s.io/v1
  2. kind: Role
  3. metadata:
  4.   namespace: default
  5.   name: pod-reader
  6. rules:
  7. - apiGroups: [""]
  8.   resources: ["pods"]
  9.   verbs: ["get", "watch", "list"]
  10. ---
  11. apiVersion: rbac.authorization.k8s.io/v1
  12. kind: RoleBinding
  13. metadata:
  14.   name: read-pods
  15.   namespace: default
  16. subjects:
  17. - kind: User
  18.   name: jane
  19.   apiGroup: rbac.authorization.k8s.io
  20. roleRef:
  21.   kind: Role
  22.   name: pod-reader
  23.   apiGroup: rbac.authorization.k8s.io
复制代码

使用Pod Security Policy(PSP)控制Pod的安全设置。

示例:
  1. apiVersion: policy/v1beta1
  2. kind: PodSecurityPolicy
  3. metadata:
  4.   name: restricted
  5. spec:
  6.   privileged: false
  7.   allowPrivilegeEscalation: false
  8.   requiredDropCapabilities:
  9.     - ALL
  10.   volumes:
  11.     - 'configMap'
  12.     - 'emptyDir'
  13.     - 'projected'
  14.     - 'secret'
  15.     - 'downwardAPI'
  16.     - 'persistentVolumeClaim'
  17.   runAsUser:
  18.     rule: 'MustRunAsNonRoot'
  19.   seLinux:
  20.     rule: 'RunAsAny'
  21.   fsGroup:
  22.     rule: 'RunAsAny'
复制代码

使用NetworkPolicy控制Pod之间的网络流量。

示例:
  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4.   name: default-deny
  5. spec:
  6.   podSelector: {}
  7.   policyTypes:
  8.   - Ingress
  9.   - Egress
复制代码

12.3 自动化最佳实践

GitOps是一种使用Git作为声明式基础架构和应用程序的单一事实来源的方法。Argo CD是一个流行的GitOps工具。

安装Argo CD:
  1. kubectl create namespace argocd
  2. kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
复制代码

创建Argo CD Application:
  1. apiVersion: argoproj.io/v1alpha1
  2. kind: Application
  3. metadata:
  4.   name: my-app
  5.   namespace: argocd
  6. spec:
  7.   project: default
  8.   source:
  9.     repoURL: 'https://github.com/yourusername/your-repo.git'
  10.     targetRevision: HEAD
  11.     path: k8s
  12.   destination:
  13.     server: 'https://kubernetes.default.svc'
  14.     namespace: default
  15.   syncPolicy:
  16.     automated:
  17.       prune: true
  18.       selfHeal: true
复制代码

使用Jenkins、GitLab CI、GitHub Actions等工具创建CI/CD管道,自动化构建、测试和部署流程。

GitHub Actions示例:
  1. name: Build and Deploy to Kubernetes
  2. on:
  3.   push:
  4.     branches: [ main ]
  5. jobs:
  6.   build-and-deploy:
  7.     runs-on: ubuntu-latest
  8.     steps:
  9.     - uses: actions/checkout@v2
  10.    
  11.     - name: Build Docker image
  12.       run: |
  13.         docker build -t my-app:${{ github.sha }} .
  14.         docker tag my-app:${{ github.sha }} my-registry/my-app:${{ github.sha }}
  15.         
  16.     - name: Push Docker image
  17.       run: |
  18.         echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
  19.         docker push my-registry/my-app:${{ github.sha }}
  20.         
  21.     - name: Deploy to Kubernetes
  22.       uses: steebchen/kubectl@v2.0.0
  23.       with:
  24.         config: ${{ secrets.KUBE_CONFIG }}
  25.         command: set image deployment/my-app my-app=my-registry/my-app:${{ github.sha }}
复制代码

Operator是一种使用自定义资源扩展Kubernetes API的方法,用于管理复杂的应用程序。

使用Operator SDK创建Operator:
  1. # 安装Operator SDK
  2. curl -L https://github.com/operator-framework/operator-sdk/releases/download/v1.10.1/operator-sdk_linux_amd64 -o operator-sdk
  3. chmod +x operator-sdk
  4. sudo mv operator-sdk /usr/local/bin/
  5. # 创建新Operator项目
  6. operator-sdk init --domain example.com --repo github.com/example/my-operator
  7. # 创建API和控制器
  8. operator-sdk create api --group apps --version v1alpha1 --kind MyApp
复制代码

12.4 性能优化最佳实践

使用多阶段构建和精简基础镜像来减小Docker镜像大小。

多阶段构建示例:
  1. # 构建阶段
  2. FROM node:14 as builder
  3. WORKDIR /app
  4. COPY package*.json ./
  5. RUN npm install
  6. COPY . .
  7. RUN npm run build
  8. # 生产阶段
  9. FROM nginx:alpine
  10. COPY --from=builder /app/dist /usr/share/nginx/html
  11. EXPOSE 80
  12. CMD ["nginx", "-g", "daemon off;"]
复制代码

使用Horizontal Pod Autoscaler(HPA)根据CPU或内存使用情况自动调整Pod数量。

示例:
  1. apiVersion: autoscaling/v2beta2
  2. kind: HorizontalPodAutoscaler
  3. metadata:
  4.   name: my-app-hpa
  5. spec:
  6.   scaleTargetRef:
  7.     apiVersion: apps/v1
  8.     kind: Deployment
  9.     name: my-app
  10.   minReplicas: 2
  11.   maxReplicas: 10
  12.   metrics:
  13.   - type: Resource
  14.     resource:
  15.       name: cpu
  16.       target:
  17.         type: Utilization
  18.         averageUtilization: 50
  19.   - type: Resource
  20.     resource:
  21.       name: memory
  22.       target:
  23.         type: Utilization
  24.         averageUtilization: 80
复制代码

使用Cluster Autoscaler根据资源需求自动调整集群节点数量。

安装Cluster Autoscaler:
  1. kubectl apply -f https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml
复制代码

12.5 成本优化最佳实践

使用节点亲和性和污点将工作负载分配到适当的节点,优化资源利用。

示例:
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: memory-intensive-app
  5. spec:
  6.   template:
  7.     spec:
  8.       affinity:
  9.         nodeAffinity:
  10.           requiredDuringSchedulingIgnoredDuringExecution:
  11.             nodeSelectorTerms:
  12.             - matchExpressions:
  13.               - key: node.kubernetes.io/instance-type
  14.                 operator: In
  15.                 values:
  16.                 - memory-optimized
  17.       containers:
  18.       - name: app
  19.         image: my-app
  20.         resources:
  21.           requests:
  22.             memory: "8Gi"
  23.           limits:
  24.             memory: "16Gi"
复制代码

在云环境中使用Spot实例(AWS)或抢占式实例(GCP)来降低成本。

使用Kubernetes调度器支持Spot实例:
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: spot-pod
  5. spec:
  6.   affinity:
  7.     nodeAffinity:
  8.       requiredDuringSchedulingIgnoredDuringExecution:
  9.         nodeSelectorTerms:
  10.         - matchExpressions:
  11.           - key: cloud.google.com/gke-spot
  12.             operator: Exists
  13.   containers:
  14.   - name: app
  15.     image: my-app
复制代码

使用工具如Kubecost、OpenCost等监控和优化Kubernetes集群的成本。

安装Kubecost:
  1. kubectl create namespace kubecost
  2. helm install kubecost kubecost/cost-analyzer --namespace kubecost --set kubecostToken="YWJjMTIz"
复制代码

13. 总结

Kubernetes是一个强大的容器编排平台,它提供了丰富的功能来部署、扩展和管理容器化应用。通过深入理解Kubernetes的核心概念和操作步骤,你可以轻松地部署和管理容器化应用,提升运维效率,成为Kubernetes高手。

本文详细介绍了Kubernetes的核心概念,包括Pod、Deployment、Service、Namespace、ConfigMap、Secret、Volume、PersistentVolume、PersistentVolumeClaim和Ingress等。我们还讨论了Kubernetes集群的架构和组件,以及如何安装和设置Kubernetes集群。

在部署和管理应用方面,我们介绍了如何创建Docker镜像、使用Deployment部署应用、暴露应用服务、扩展应用、滚动更新、蓝绿部署和金丝雀发布等策略。我们还讨论了配置管理、密钥管理、网络配置、存储管理、监控和日志等方面的内容。

最后,我们分享了一些故障排除的技巧和最佳实践,包括资源管理、安全、自动化、性能优化和成本优化等方面的建议。

通过掌握这些知识和技能,你将能够有效地使用Kubernetes来部署和管理容器化应用,提升运维效率,成为Kubernetes高手。希望本文能够帮助你更好地理解和使用Kubernetes,为你的容器化应用提供强大的支持。
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则