KUBERNETES03_命名空间Pod是什么Deployment多副本能力扩缩容自愈或故障转移滚动更新版本回退

Posted 所得皆惊喜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KUBERNETES03_命名空间Pod是什么Deployment多副本能力扩缩容自愈或故障转移滚动更新版本回退相关的知识,希望对你有一定的参考价值。

①. 资源创建方式

  • ①. 命令行(比如创建一个命名空间为TANG:kubectl create ns TANG)

  • ②. YAML

apiVersion: v1
kind: Namespace
metadata:
  name: TANG

②. 命名空间Namespace

  • ①. Namespace:名称空间,用来对集群资源进行隔离划分。默认只隔离资源,不隔离网络

  • ②. 关于Namespace中基本的命令
    kubectl get ns:查看命名空间
    kubectl create ns hello:创建命名空间
    kubectl delete ns hello:删除命名空间

  • ③. 使用yaml的文件创建命名空间(下面创建了hello的命名空间),hello.yaml
    如果要删除命名空间:kubectl delete -f hello.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: hello
  • ④. 使用kubectl get pods:查看的是默认(default命名空间)下的内容
[root@k8s-master~]kubectl get pods
No resources found in default namespace

③. Pod

①. Pod的概念

  • ①. 运行中的一组容器,Pod是kubernetes中应用的最小单位

②. 使用命令行的形式创建pod

  • ①. 使用命令行的形式创建pod(如kubectl run mynginx–image=nginx)

  • ②. kubectl run mynginx --image=nginx

  • ③. 查看default名称空间的Pod:kubectl get pod

  • ④. 描述:kubectl describe pod 你自己的Pod名字

  • ⑤. 删除:kubectl delete pod Pod名字

  • ⑥. 查看Pod的运行日志:kubectl logs Pod名字 h或者 kubectl logs -f Pod名字

  • ⑦. 每个Pod - k8s都会分配一个ip:kubectl get pod -owide (-o wide)

  • ⑧. 集群中的任意一个机器以及任意的应用都能通过Pod分配的ip来访问这个Pod,部署在pod中的应用,不能通过浏览器的方式进行访问

# 我们在master节点运行
[root@k8smaster ~]# kubectl run mynginx --image=nginx
pod/mynginx created
# 这里会将创建的pod默认在default命名空间下
[root@k8smaster ~]# kubectl get pod
NAME      READY   STATUS              RESTARTS   AGE
mynginx   0/1     ContainerCreating   0          14s
[root@k8smaster ~]# kubectl describe pod mynginx

# 在node2节点可以看到运行的mynginx和nginx镜像
[root@k8snode2 ~]# docker ps |grep mynginx
8596f8e18360   nginx                                                        "/docker-entrypoint.…"   3 minutes ago    Up 3 minutes              k8s_mynginx_mynginx_default_e3a3add5-2a0a-4af4-bcdb-719e8c1ff231_0
774584bc088f   registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/pause:3.2   "/pause"                 4 minutes ago    Up 4 minutes              k8s_POD_mynginx_default_e3a3add5-2a0a-4af4-bcdb-719e8c1ff231_0
[root@k8snode2 ~]# docker images
REPOSITORY                                                                 TAG        IMAGE ID       CREATED         SIZE
nginx                                                                      latest     ea335eea17ab   11 days ago     141MB
# 查看Pod的运行日志
kubectl logs Pod名字
# 每个Pod - k8s都会分配一个ip
kubectl get pod -owide
# 使用Pod的ip+pod里面运行容器的端口
curl 192.168.169.136

[root@k8smaster ~]# kubectl get pods -owide
NAME      READY   STATUS    RESTARTS   AGE   IP               NODE       NOMINATED NODE   READINESS GATES
mynginx   1/1     Running   0          21m   11.168.185.196   k8snode2   <none>           <none>
[root@k8smaster ~]# curl 11.168.185.196 
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html  color-scheme: light dark; 
body  width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; 
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@k8smaster ~]# kubectl logs -f mynginx
2021/11/28 12:54:19 [notice] 1#1: start worker process 38
2021/11/28 12:54:19 [notice] 1#1: start worker process 39
11.168.16.128 - - [28/Nov/2021:13:14:56 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
# 如何进入到mynginx容器
[root@k8smaster ~]# kubectl get pods 
NAME      READY   STATUS    RESTARTS   AGE
mynginx   1/1     Running   0          15m
[root@k8smaster ~]# kubectl exec -it mynginx -- /bin/bash
root@mynginx:/# cd /usr/share/nginx/html/
root@mynginx:/usr/share/nginx/html# ls
50x.html  index.html
root@mynginx:/usr/share/nginx/html# echo "hello tang"->index.html
root@mynginx:/usr/share/nginx/html# 
[root@k8smaster ~]# kubectl get pod mynginx -owide
NAME      READY   STATUS    RESTARTS   AGE   IP               NODE       NOMINATED NODE   READINESS GATES
mynginx   1/1     Running   0          16m   11.168.185.197   k8snode2   <none>           <none>
[root@k8smaster ~]# curl 11.168.185.197
hello tang-

③. yaml文件的形式创建pod

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: mynginx
  name: mynginx
#  namespace: default
spec:
  containers:
  - image: nginx
    name: mynginx

④. 使用图形化界面创建pod




⑤. 多容器pod细节

  • ①. kubectl apply -f tomcatandnginx.yaml
    如果在同一个pod里面nginx要访问tomcat,只需要进入到nginx的容器内,通过localhost的方式就能进行访问
    如果在同一个pod里面tomcat要访问nginx,只需要进入到tomcat的容器内,通过localhost的方式就能进行访问
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: myapp
  name: myapp
spec:
  containers:
  - image: nginx
    name: nginx
  - image: tomcat:8.5.68
    name: tomcat


  • ②. 同一个pod里面不能同时启动两个nginx或者redis等

④. Deployment多副本能力

  • ①. 控制Pod,使Pod拥有多副本,自愈,扩缩容等能力
  1. 如果我们使用deployment去创建,那么如果我们使用delete删除后,它底层会删掉这个旧的重新启动一个新的出来,这里我们就可以体会到它的自愈能力
    如果我们使用kubectl run mynginx --image=nginx,使用delete命令删除后就真的删除了
  2. 查看deployment:kubectl get deploy
  3. 删除deployment:kubectl delete deploy 你的名字
# 清除所有Pod,比较下面两个命令有何不同效果?
kubectl run mynginx --image=nginx

kubectl create deployment mytomcat --image=tomcat:8.5.68
# 自愈能力
  • ②. 多副本命令行方式:kubectl create deployment my-dep --image=nginx --replicas=3

  • ③. 多副本可视化创建deployment


  • ④. 多副本yaml文件创建方式
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: my-dep
  name: my-dep
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-dep
  template:
    metadata:
      labels:
        app: my-dep
    spec:
      containers:
      - image: nginx
        name: nginx

⑤. Deployment扩缩容

  • ①. 扩容缩容的命令:kubectl scale
# 假设现在my-dep只有3个pod
kubectl scale --replicas=5 deployment/my-dep 
# 缩容(修改 replicas)
# 下面这种方式会打开一个配置文件
kubectl edit deployment my-dep

  • ②. 可以在可视化界面进行扩缩容能力

⑥. Deployment:自愈或故障转移

  • ①. 停机(停机之后自愈能力是指停机后Deploy会让这个停机的容器又尝试重启)

  • ②. 删除pod、容器宕机(现在有master、node1、node2,如果node1机器直接宕机了,经过一段时间,原来在node1上的pod会转移到node2节点上)

⑦. Deployment:滚动更新

  • ①. 滚动更新:如下图的v1想转换到v2,这个时候会尝试启动第使用v2的第一个pod,只有当v2的第一个pod起作用后,会替换掉v1的第一个pod,然后一次更新第二个v1的pod,会存在v1、v2两个版本并存的情况

  • ②. 使用命令的方式实现滚动更新
    kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record(注意这里的nginx=nginx:1.16.1第一个nginx需要通过命令 kubectl get deploy my-dep-01 -oyaml查看到)
# 实时的去监控
[root@k8smaster ~]# kubectl get pod -w
NAME                        READY   STATUS    RESTARTS   AGE
my-dep-01-686cfb7bf-8hwp8   1/1     Running   1          11h
my-dep-01-686cfb7bf-9g2ws   1/1     Running   1          11h
my-dep-01-686cfb7bf-9jz5m   1/1     Running   1          11h
my-dep-01-686cfb7bf-b54z6   1/1     Running   1          11h
my-dep-01-686cfb7bf-xhvjz   1/1     Running   1          11h
# 使用如下命令后,会出现下图的效果
[root@k8smaster ~]# kubectl get deploy my-dep-01 -0yaml

  • ③. 更新好之后,使用如下命令监控可以看到已经进行了替换
# 通过命令我们已经发生了滚动更新,将nginx:laster的版本更新到了nginx:1.16.1
[root@k8smaster ~]# kubectl get deploy my-dep-01 -oyaml |grep nginx
    kubernetes.io/change-cause: kubectl set image deployment/my-dep-01 my-dep-01=nginx:1.16.1
      - image: nginx:1.16.1

⑧. Deployment:版本回退

  • ①. 通过kubectl rollout history deployment/my-dep-01查看之前的历史,2这个版本我们将nginx改为了1.16.1的版本,然后我们使用命令进行回退,又将1.16.1的版本改为了latest
[root@k8smaster ~]# kubectl rollout history deployment/my-dep-01
deployment.apps/my-dep-01 
REVISION  CHANGE-CAUSE
1         <none>
2         kubectl set image deployment/my-dep-01 my-dep-01=nginx:1.16.1 --record=true
[root@k8smaster ~]# kubectl rollout undo deployment/my-dep-01 --to-revision=1
deployment.apps/my-dep-01 rolled back
[root@k8smaster ~]# kubectl get deploy my-dep-01 -oyaml |grep nginx
      - image: nginx

  • ②. 版本回退常用命令
#历史记录
kubectl rollout history deployment/my-dep
#查看某个历史详情
kubectl rollout history deployment/my-dep --revision=2
#回滚(回到上次)
kubectl rollout undo deployment/my-dep
#回滚(回到指定版本)
kubectl rollout undo deployment/my-dep --to-revision=2

⑨. 其他工作负载

以上是关于KUBERNETES03_命名空间Pod是什么Deployment多副本能力扩缩容自愈或故障转移滚动更新版本回退的主要内容,如果未能解决你的问题,请参考以下文章

KUBERNETES03_k8s对象是什么如何管理命名空间代码自动补全提示

KUBERNETES03_k8s对象是什么如何管理命名空间代码自动补全提示

只监控一个命名空间 pod - Prometheus & Kubernetes & cadvisor

Kubernetes对象之Pod

找出 Kubernetes 节点的磁盘空间

Kubernetes之Pod常用操作