Kubernetes入门实验:deployment

458 阅读2分钟

k8s deployment 实验。
注:本文为笔者实验记录,非教程。

环境

# kubectl get node
NAME              STATUS     ROLES    AGE   VERSION
edge-node         Ready      <none>   15m   v1.17.0
edge-node2        Ready      <none>   16m   v1.17.0
ubuntu            Ready      master   67d   v1.17.0

Deployment

技术总结

测试yaml文件

# vim nginx-deployment.yaml

apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
   app: nginx
spec:
  replicas: 3 # tells deployment to run 2 pods matching the template
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: latelee/lidch 
        ports:
        - containerPort: 80

创建:

kubectl create -f nginx-deployment.yaml

查看:


# kubectl get deployments -o wide
NAME               READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES          SELECTOR
nginx-deployment   3/3     3            3           5m11s   nginx        latelee/lidch   app=nginx

# kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-55677b6b95   3         3         3       5m41s

# kubectl get pod -l app=nginx
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-55677b6b95-2khzn   1/1     Running   0          5m48s
nginx-deployment-55677b6b95-2v5kf   1/1     Running   0          5m48s
nginx-deployment-55677b6b95-vpwsn   1/1     Running   0          5m48s

# kubectl rollout status deployment nginx-deployment 或者 kubectl rollout status deployment/nginx-deployment
deployment "nginx-deployment" successfully rolled out

查看:

# kubectl describe deployment

暴露端口:

kubectl expose deployment nginx-deployment --port 88

TODO:测试未成功。

升级回滚测试

更新文件,再测试,将image: latelee/lidch 改为 image: latelee/lidch:1.1,再执行:

kubectl apply -f nginx-deployment.yaml

会自动升级镜像版本(旧的pod被删除,新的pod被创建,半个月后的PS:似乎此法不可行)。
另一个简单的更改镜像版本的命令:

kubectl set image deployment/nginx-deployment nginx=latelee/lidch

其中,nginx=latelee/lidch前者为容器名称,后者为镜像名称(及版本)。如果新版本镜像不存在,则自动拉取,耗时较长,反之则短。

验证:

# curl 10.244.4.28  // IP为pod的IP

deployment的升级,与rc的不太一样,似乎deployment简单些。

查看历史:

kubectl rollout history deployment/nginx-deployment
输出:
deployment.apps/nginx-deployment 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>

查看某版本信息:
kubectl rollout history deployment nginx-deployment --revision=1

回滚到1版本:

kubectl rollout undo deployment/nginx-deployment --to-revision=1

此时会自动更新pod(旧的删除,新的创建)。
验证:

# curl 10.244.4.29  // IP为pod的IP

升级说明: 如果deployment只有一个,则在旧的销毁,新的创建过程中,服务是无法访问的。因此,才会指定多个副本。

自动扩缩容

手动扩容、缩容:

kubectl scale deployment nginx-deployment --replicas=10
kubectl scale deployment nginx-deployment --replicas=2

自动扩容、缩容:

kubectl autoscale deployment nginx-deployment --min=2 --max=15 --cpu-percent=70

再次执行,提示已存在:

Error from server (AlreadyExists): horizontalpodautoscalers.autoscaling "nginx-deployment" already exists

TODO 未解决。

问题

0/3 nodes are available: 1 node(s) had taints that the pod didn't tolerate, 2 node(s) didn't have free ports for the requested pod ports.

原因:pod已经占用节点端口,无法再启动。