在Kubernetes中,Deployment是管理应用副本的核心对象。它通过控制ReplicaSet来创建和管理一组Pod副本,使我们无需直接操作ReplicaSet。下面我们通过创建一个Nginx应用来演示。
1. 创建Deployment
首先,我们编写一个nginx-deployment.yaml文件。

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
配置文件解析:
apiVersion: 定义API组和版本。
kind: 资源类型,这里是Deployment。
metadata.name: 当前Deployment的名称。
spec.replicas: 指定Pod副本数量为3个。
spec.template.metadata.labels: 为Pod模板定义标签,需与selector.matchLabels匹配。
spec.template.spec.containers: 定义容器规格,包括名称、镜像和暴露端口。
执行以下命令创建Deployment:
kubectl apply -f nginx-deployment.yaml
查看Deployment状态:
kubectl get deploy
查看Pod状态:
kubectl get pod
创建初期,Pod状态可能为ContainerCreating,因为需要从镜像仓库拉取nginx:1.7.9镜像。

等待片刻后,所有Pod将进入Running状态。

使用kubectl get pod -o wide可以查看Pod被分配到的节点及集群内部IP。此时,该Nginx服务仅能在Kubernetes集群内部通过IP访问。

2. 创建Service
Service为后端的一组Pod提供一个稳定的访问入口,并实现负载均衡。外部请求通过Service访问到匹配标签的Pod实例。
创建nginx-svc.yaml文件:

apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
type: NodePort
selector:
app: nginx
ports:
- port: 80
targetPort: 80
nodePort: 30565
关键配置spec.selector选择了标签为app: nginx的Pod,这与Deployment中定义的Pod标签一致。
创建Service:
kubectl apply -f nginx-svc.yaml
查看Service:
kubectl get svc

由于Service类型设置为NodePort,Kubernetes会在每个节点上开放指定端口(如30565)。现在,我们可以通过浏览器访问<任意节点IP>:30565。Service会将请求负载均衡到后端的3个Pod中。

3. 应用升级与回滚
3.1 查看当前版本
首先确认当前运行的镜像版本。
kubectl get pod
kubectl describe pod <pod-name>
在输出信息中可以找到Image: nginx:1.7.9。

3.2 更新镜像
使用kubectl set image命令升级Deployment的镜像版本,--record参数会将此命令记录到发布历史中。
kubectl set image deploy/nginx-deployment nginx=nginx:1.10 --record

Kubernetes会采用滚动更新策略:逐步启动新版本Pod,并终止旧版本Pod,从而实现不中断服务的灰度发布。执行kubectl get pod观察此过程。

稍等片刻,所有Pod将被替换为新版本nginx:1.10。
3.3 回滚版本
查看发布历史:
kubectl rollout history deploy/nginx-deployment

回滚到上一个版本:
kubectl rollout undo deploy/nginx-deployment
或回滚到指定历史版本(例如版本2):
kubectl rollout undo deploy/nginx-deployment --to-revision=2
回滚操作同样采用滚动更新方式,将镜像版本恢复至1.7.9。

4. 安装Kubernetes Dashboard
Dashboard是Kubernetes的官方Web管理界面。由于默认镜像仓库k8s.gcr.io在国内访问困难,我们需要先准备镜像。
4.1 准备镜像
在每个节点(包括Master和Node)上执行以下Docker操作,从国内镜像源拉取并重命名镜像。
创建一个dashborad-image.sh脚本文件:
vim dashborad-image.sh
脚本内容:
#!/bin/bash
docker pull registry.cn-shanghai.aliyuncs.com/qubit/kubernetes-dashboard-amd64:v1.10.0
docker tag registry.cn-shanghai.aliyuncs.com/qubit/kubernetes-dashboard-amd64:v1.10.0 k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1
docker image rm registry.cn-shanghai.aliyuncs.com/qubit/kubernetes-dashboard-amd64:v1.10.0
赋予脚本执行权限并运行:
chmod +x dashborad-image.sh
sh dashborad-image.sh
4.2 部署Dashboard
使用官方提供的YAML文件部署Dashboard。通常可以从GitHub获取对应版本的recommended.yaml。这里以一份示例配置为例,保存为dashboard.yaml。
(注:YAML内容较长,主要包含ServiceAccount、Role、RoleBinding、Deployment和Service等资源定义。)
创建Dashboard资源:
kubectl create -f dashboard.yaml
默认创建的Service类型为ClusterIP,将其修改为NodePort以便外部访问:
kubectl patch svc kubernetes-dashboard -p '{"spec":{"type":"NodePort"}}' -n kube-system
查看Service分配的节点端口:
kubectl get svc -n kube-system
如图,端口为31141,访问地址为https://<master_ip>:31141(需使用Firefox浏览器处理自签名证书)。
4.3 创建管理用户
创建一个拥有集群管理员权限的ServiceAccount来登录Dashboard。
创建admin-user.yaml:
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-app: kubernetes-dashboard
name: admin
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin
namespace: kube-system
创建用户并获取Token:
kubectl create -f admin-user.yaml
# 查看ServiceAccount详情,获取Secret名称
kubectl describe serviceaccount admin -n kube-system
# 从Secret中获取Token
kubectl describe secret <secret-name> -n kube-system
4.4 登录Dashboard
使用Firefox浏览器访问https://<master_ip>:31141,选择“高级”->“接受风险并继续”,在登录界面选择“令牌(Token)”,粘贴上一步获取的Token即可登录。
