Alice.tech

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