k8s初体验
正文 快速部署 先从k3s开始上手,一键安装 部署一个nginx应用,创建一个deployment 查看deployment 与 pod状态 了解一下k8s的工作流程,pod作为最小的工作单位 ,可以理解为容器 depl…
正文
快速部署
先从k3s开始上手,一键安装
curl -sfL https://get.k3s.io | sh -
部署一个nginx应用,创建一个deployment
kubectl create deployment nginx-test --image=nginx
查看deployment 与 pod状态
kubectl get deployments
kubectl get pods
了解一下k8s的工作流程,pod作为最小的工作单位 ,可以理解为容器
deployment用于控制Pod
pod上的服务通过service向集群外部暴露,service类似nginx,用于负载均衡,分流
让我们继续,创建一个service把刚刚部署的nginx暴露
kubectl expose deployment nginx-test --port=8080 --type=NodePort
查看service服务
kubectl get service
可以看到,通过30613端口暴露,访问试试
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 21m
nginx-test NodePort 10.43.102.1 <none> 80:30613/TCP 9s
扩缩Deployment
查看先前的deployment
kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-test 1/1 1 1 16h
- NAME 列出了集群中的 Deployment 的名称。
- READY 显示当前副本数与期望副本数的比例。
- UP-TO-DATE 显示已更新至期望状态的副本数。
- AVAILABLE 显示可用的 Pod 的数量。
- AGE 显示应用已运行的时间。
查看详细信息
kubectl get rs
类似的输出
NAME DESIRED CURRENT READY AGE
nginx-test-6ff8854996 1 1 1 16h
-
DESIRED 显示期望应用具有的副本数量,在你创建 Deployment 时要定义这个值。这是期望的状态。
-
CURRENT 显示当前正在运行的副本数量
接下来把副本扩容到4个
kubectl scale deployments/nginx-test --replicas=4
看看扩容后的
kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-test 4/4 4 4 17h
看看扩容后的pod变化,-o wide参数列出更‘宽’信息
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-test-6ff8854996-gs55g 1/1 Running 0 17h 10.42.0.9 caat <none> <none>
nginx-test-6ff8854996-j545r 1/1 Running 0 2m46s 10.42.0.11 caat <none> <none>
nginx-test-6ff8854996-jlmlp 1/1 Running 0 2m46s 10.42.0.12 caat <none> <none>
nginx-test-6ff8854996-wv85f 1/1 Running 0 2m46s 10.42.0.10 caat <none> <none>
查看deployment的事件日志
kubectl describe deployments/nginx-test
Name: nginx-test
Namespace: default
CreationTimestamp: Thu, 04 Jun 2026 21:07:19 +0800
Labels: app=nginx-test
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=nginx-test
Replicas: 4 desired | 4 updated | 4 total | 4 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=nginx-test
Containers:
nginx:
Image: nginx
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Node-Selectors: <none>
Tolerations: <none>
Conditions:
Type Status Reason
---- ------ ------
Progressing True NewReplicaSetAvailable
Available True MinimumReplicasAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-test-6ff8854996 (4/4 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 5m47s deployment-controller Scaled up replica set nginx-test-6ff8854996 from 1 to 4
也是非常详细的说,接下来在看看service的
kubectl describe service/nginx-test
Name: nginx-test
Namespace: default
Labels: app=nginx-test
Annotations: <none>
Selector: app=nginx-test
Type: NodePort
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.43.102.1
IPs: 10.43.102.1
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 30613/TCP
Endpoints: 10.42.0.9:80,10.42.0.11:80,10.42.0.10:80 + 1 more...
Session Affinity: None
External Traffic Policy: Cluster
Internal Traffic Policy: Cluster
Events: <none>
缩容,同理
kubectl scale deployments/nginx-test --replicas=2
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-test-6ff8854996-gs55g 1/1 Running 0 17h 10.42.0.9 caat <none> <none>
nginx-test-6ff8854996-jlmlp 1/1 Running 0 42m 10.42.0.12 caat <none> <none>
滚动更新
更新服务的镜像
先查看当前的镜像,
kubectl describe pods | Image
Image: nginx
Image ID: docker.io/library/nginx@sha256:5aca99593157f4ae539a5dec1092a0ad8762f8e2eb1789085a13a0f5622369f6
Image: nginx
Image ID: docker.io/library/nginx@sha256:5aca99593157f4ae539a5dec1092a0ad8762f8e2eb1789085a13a0f5622369f6
切换deployment中的镜像
kubectl set image deployments/nginx-test nginx=docker.io/nginx:1.27.0
查看pod的变化
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-test-6ff8854996-gs55g 1/1 Running 0 22h 10.42.0.9 caat <none> <none>
nginx-test-6ff8854996-jlmlp 1/1 Running 0 5h15m 10.42.0.12 caat <none> <none>
nginx-test-78d7c7875c-z2d88 0/1 ContainerCreating 0 23s <none> caat <none> <none>
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-test-78d7c7875c-vwc6c 1/1 Running 0 27s 10.42.0.19 caat <none> <none>
nginx-test-78d7c7875c-z2d88 1/1 Running 0 62s 10.42.0.18 caat <none> <none>
可以看到原先的 gs55g j1m1p pod被删除 替换为了新的 vwc6c z2d88
现在你看到了 Deployment 正在滚动更新 的过程 ,
🔄 接下来会发生什么?
Deployment 默认的滚动更新策略是 “先启动一个新的,再停一个旧的”,保证服务不中断。你的 Service
nginx-test在这个过程中会一直把流量负载均衡到健康的 Pod 上。
如果一次更新的pod很多。查看情况,等待输出 success
kubectl rollout status deployment/nginx-test
回滚deployment上一次的上线
kubectl rollout undo deployment
了解deployment
Deployment 用于管理运行一个应用负载的一组 Pod,通常适用于不保持状态的负载。
一个 Deployment 为 Pod 和 ReplicaSet 提供声明式的更新能力。
你负责描述 Deployment 中的目标状态,而 Deployment 控制器(Controller) 以受控速率更改实际状态, 使其变为期望状态。你可以定义 Deployment 以创建新的 ReplicaSet,或删除现有 Deployment, 并通过新的 Deployment 收养其资源
原始笔记:cloud/k8s初体验.md