K8s-day4-kubectl常用命令+资源控制器

15 篇文章 5 订阅

文章目录

kubectl常用命令与资源控制器

  • 强制删除资源

    # 强制删除Pod
    kubectl delete pod <your-pod-name> -n <name-space> --force --grace-period=0export ETCDCTL_API=3
    etcdctl del /registry/pods/default/Pod_名称
    
    # 强制删除PV
    kubectl patch pv pv_name -p '{"metadata":{"finalizers":null}}'
    
    # 强制删除PVC
    kubectl patch pvc -n namaspace pvc_name -p '{"metadata":{"finalizers":null}}'
    
    # 强制删除NameSpace
    ## ETCD方式删除(速度快)
    export ETCDCTL_API=3
    etcdctl del /registry/namespaces/命名空间名称
    
    ## json方式
    1.kubectl get ns test -o json > tmp.json
    2.vim tmp.json	# 删除spec内的所有内容
    {
        "apiVersion": "v1",
        "kind": "Namespace",
        "metadata": {
            "creationTimestamp": "2021-12-25T06:19:25Z",
            "deletionTimestamp": "2021-12-25T06:19:25Z",
            "labels": {
                "kubernetes.io/metadata.name": "test"
            },
            "name": "test",
            "resourceVersion": "1621503",
            "selfLink": "/api/v1/namespaces/test",
            "uid": "1758691c-0ef1-44b4-8503-ede7d659ea44"
        },
        "spec": {
            "finalizers": [		# 删除此行
                "kubernetes"	# 删除此行
            ]					# 删除此行
        },
        "status": {
            "phase": "Terminating"
        }
    }
    
    3.kubectl proxy --port=8081	# 然后新开一个窗口运行kubectl proxy跑一个API代理在本地的8081端口
    4.尾部改为要删除的命名空间名字
    curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8081/api/v1/namespaces/命名空间名字
    

一、kubectl 通用命令及选项

1.查看类

# 查看节点与附加信息
kubectl get nodes -o wide

# 获取节点和服务版本信息
kubectl get nodes

# 获取节点和服务版本信息,并查看附加信息
kubectl get nodes -o wide

# 获取pod信息,默认是default名称空间
kubectl get pod

# 获取pod信息,默认是default名称空间,并查看附加信息【如:pod的IP及在哪个节点运行】
kubectl get pod -o wide

# 获取指定名称空间的pod
kubectl get pod -n kube-system

# 获取指定名称空间中的指定pod
kubectl get pod -n kube-system podName

# 获取所有名称空间的pod
kubectl get pod -A 

# 查看pod的详细信息,以yaml格式或json格式显示
kubectl get pods -o yaml
kubectl get pods -o json

# 查看pod的标签信息
kubectl get pod -A --show-labels 

# 根据Selector(label query)来查询pod
kubectl get pod -A --selector="k8s-app=kube-dns"

# 查看运行pod的环境变量
kubectl exec podName env

# 查看指定pod的日志
kubectl logs -f --tail 500 -n kube-system kube-apiserver-k8s-master

# 查看所有名称空间的service信息
kubectl get svc -A

# 查看指定名称空间的service信息
kubectl get svc -n kube-system

# 查看component statuses信息
kubectl get cs

# 查看所有configmaps信息
kubectl get cm -A

# 查看所有serviceaccounts信息
kubectl get sa -A

# 查看所有daemonsets信息
kubectl get ds -A

# 查看所有deployments信息
kubectl get deploy -A

# 查看所有replicasets信息
kubectl get rs -A

# 查看所有statefulsets信息
kubectl get sts -A

# 查看所有jobs信息
kubectl get jobs -A

# 查看所有ingresses信息
kubectl get ing -A

# 查看有哪些名称空间
kubectl get ns

# 查看pod的描述信息
kubectl describe pod podName
kubectl describe pod -n kube-system kube-apiserver-

# 查看指定名称空间中指定deploy的描述信息
kubectl describe deployment -n kube-system coredns
kubectl describe daemonsets.apps php

# 查看node或pod的资源使用情况(需要heapster 或metrics-server支持)
kubectl top node
kubectl top pod 

# 查看集群信息
kubectl cluster-info   或  kubectl cluster-info dump

# 查看各组件信息(172.16.1.110为master机器)
kubectl -s https://172.16.1.110:6443 get componentstatuses 

2.操作类

  • create:有则不建,无则创建
  • apply :有则更新,无则创建
# 创建资源
kubectl create -f xxx.yaml

# 应用资源
kubectl apply -f xxx.yaml

==========================================================================================

# 应用资源,该目录下的所有 .yaml, .yml, 或 .json 文件都会被使用
kubectl apply -f <directory>

# 创建test名称空间
kubectl create namespace test

==========================================================================================

# 针对不同类型pod,要对应删除,否则是删不掉的,常用类型有:
pod
deployments.apps
daemonsets.apps
service

# 删除资源
kubectl delete -f xxx.yaml
kubectl delete -f <directory>

# 删除指定的pod
kubectl delete pod podName

# 删除指定名称空间的指定pod
kubectl delete pod -n test podName

# 删除其他资源
kubectl delete svc svcName
kubectl delete deploy deployName
kubectl delete ns nsName
# 强制删除其他资源	
kubectl delete svc --grace-period=0 --force


# 强制删除
kubectl delete pods <pod> --grace-period=0 --force
kubectl delete pod podName -n nsName --grace-period=0 --force
kubectl delete pod podName -n nsName --grace-period=1
kubectl delete pod podName -n nsName --now
 
# 编辑资源
kubectl edit pod podName

3.进阶类

# kubectl exec:进入pod启动的容器
kubectl exec -it podName -n nsName /bin/sh    #进入容器
kubectl exec -it podName -n nsName /bin/bash  #进入容器
 
# kubectl label:添加label值
kubectl label nodes k8s-node01 zone=north  #为指定节点添加标签 
kubectl label nodes k8s-node01 zone-       #为指定节点删除标签
kubectl label pod podName -n nsName role-name=test    #为指定pod添加标签
kubectl label pod podName -n nsName role-name=dev --overwrite  #修改lable标签值
kubectl label pod podName -n nsName role-name-        #删除lable标签
 
# kubectl滚动升级; 通过 kubectl apply -f myapp-deployment-v1.yaml 启动deploy
kubectl apply -f myapp-deployment-v2.yaml     #通过配置文件滚动升级
kubectl set image deploy/myapp-deployment myapp="registry.cn-beijing.aliyuncs.com/google_registry/myapp:v3"   #通过命令滚动升级
kubectl rollout undo deploy/myapp-deployment 或者 kubectl rollout undo deploy myapp-deployment    #pod回滚到前一个版本
kubectl rollout undo deploy/myapp-deployment --to-revision=2  #回滚到指定历史版本
 
# kubectl scale:动态伸缩
kubectl scale deploy myapp-deployment --replicas=5  # 动态伸缩
kubectl scale --replicas=8 -f myapp-deployment-v2.yaml  #动态伸缩【根据资源类型和

二、NameSpace名称空间

1.查看名称空间

  • k8s中名称空间是用来隔离集群资源,而k8s中的资源也分为名称空间级资源以及集群级资源
  • kubectl是k8s客户端,它跟k8s没有任何关系,就像mysql是mysqld的客户端(一个连接管理工具而已)
  • 注:部署应用一般是部署在自己的名称空间之内
格式:
kubectl get ns
kubectl get namespace

查看名称空间:
# 方式一
[root@k8s-master1 ~] kubectl get namespace
NAME              STATUS   AGE
default           Active   5d16h
kube-node-lease   Active   5d16h
kube-public       Active   5d16h
kube-system       Active   5d16h

# 方式二
[root@k8s-master1 ~] kubectl get ns
NAME              STATUS   AGE
default           Active   5d16h
kube-node-lease   Active   5d16h
kube-public       Active   5d16h
kube-system       Active   5d16h

2.创建一个名称空间

格式:
kubectl create ns [Name]
kubectl create namespace [Name]

# 方式一
[root@k8s-master1 ~] kubectl create namespace wordpress
namespace/wordpress created

# 方式二
[root@k8s-master1 ~] kubectl create ns wp
namespace/wp created

# 查看
[root@k8s-master1 ~] kubectl get ns
NAME              STATUS   AGE
default           Active   6d22h
kube-node-lease   Active   6d22h
kube-public       Active   6d22h
kube-system       Active   6d22h
wordpress         Active   1s
wp                Active   94s

3.删除名称空间

格式:
kubectl delete ns [Name]
kubectl delete namespace [Name]

# 方式一
[root@k8s-master1 ~] kubectl delete namespace wp wordpress
namespace "wp" deleted
namespace "wordpress" deleted

# 方式二
[root@k8s-master1 ~] kubectl delete ns wp wordpress
namespace "wp" deleted
namespace "wordpress" deleted

4.指定名称空间创建Pod

  • namespace后指定名称空间
格式:
kubectl create -f xxx.yaml	有则不建,无则创建
kubectl apply -f xxx.yaml	有则更新,无则创建

# 在资源清单指定名称空间
[root@k8s-master1 yaml] cat nginx.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  namespace: wp
spec:
  containers:
    - name: nginx
      image: nginx
    - name: tomcat
      image: tomcat

# 创建Pod
[root@k8s-master1 yaml] kubectl create -f nginx.yaml 
pod/nginx-pod created

三、Label(标签)

  • 类似docker中的tag:TAG = 仓库URL/名称空间/仓库名称:版本号
  • 要具有标志性,见名知意,如:version=1.8
  • k8s当做标签是用来管理(识别一系列)容器,方便与管理和监控拥有同一标签的所有容器

1.查询标签

格式:
kubectl get pod --show-lables			# 查询所有标签
kubectl get pod --show-lables [Name]	# 指定查询标签

# 例:查询所有标签
kubectl get pod --show-labels 

# 例:指定查询标签
kubectl get pods --show-labels zabbix-agent-6h87t

2.增加标签

  • 先删除,后增加
  • 一个pod可拥有多个标签
格式:
kubectl lable pod [Name] [key=value]
[Name]			# 容器名
[key=value]		# 标签类型+标签信息

1.当前无标签
[root@k8s-master1 yaml] kubectl get pod --show-labels 
NAME                 READY   STATUS    RESTARTS   AGE   LABELS
nginx-pod            0/2     Pending   0          17s   <none>

2.增加一个标签
[root@k8s-master1 yaml] kubectl label pod nginx-pod app=nginx
pod/nginx-pod labeled
[root@k8s-master1 yaml] kubectl get pod --show-labels 
NAME                 READY   STATUS    RESTARTS   AGE    LABELS
nginx-pod            0/2     Pending   0          2m9s   app=nginx

3.再增加一个标签
[root@k8s-master1 yaml] kubectl label pod nginx-pod version=1.8
pod/nginx-pod labeled
[root@k8s-master1 yaml] kubectl get pod --show-labels 
NAME                 READY   STATUS    RESTARTS   AGE     LABELS
nginx-pod            0/2     Pending   0          3m38s   app=nginx,version=1.8

3.删除标签

格式
kubectl lable pod [Name] [标签+减号]

[root@k8s-master1 yaml] kubectl label pod nginx-pod version-
pod/nginx-pod labeled
[root@k8s-master1 yaml] kubectl get pod --show-labels 
NAME                 READY   STATUS    RESTARTS   AGE     LABELS
nginx-pod            0/2     Pending   0          6m42s   app=nginx

4.yaml标签位置格式

apiVersion: v1
kind: Pod
metadata:
  name: test-tag
  labels:
    release: stable
spec:
  containers:
    - name: nginx
      image: nginx

四、Replication Controller(复制控制器)

1.概念

  • 简称RC,应用托管在Kubernetes之后,RC会确保任何时间Kubernetes中都有指定数量的Pod在持续运行,达到故障转移高可用的效果,因为Pod自身不具备故障转移。

  • 在此基础上,RC还提供了一些更高级的特性,比如滚动升级、升级回滚等;

  • RC与Pod的关联是通过Label(标签)来实现的,Label机制是Kubernetes中的一个重要设计,通过Label进行对象的弱关联,可以灵活地进行分类和选择;

  • Label的定义是任意且可多个的,但是Label必须具有可标识性,比如设置Pod的应用名称和版本号等,另外Lable是不具有唯一性的,为了更准确的标识一个Pod,应该为Pod设置多个Lable!

2.主要功能

弹性伸缩、滚动升级

1)弹性伸缩
  • 弹性伸缩是指适应负载变化,以弹性可伸缩的方式提供资源,反映到kubernetes中,指的是可根据负载的高低动态调整Pod的副本数量;调整Pod的副本数,是通过修改RC中Pod的副本来实现的
示例yaml
  • 类型为RC,使用此类型,将自动拥有自愈功能(容器状态异常后,会自动起一个新的)
  • 启动两个一样的Pod,通过自定义副本数,以达到弹性扩容、缩容的目的!
  • 自动缩容:优先保留启动时间长的(相对稳定),先干掉新来的!
cat > shensuo.yaml <<EOF
apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx-controller
spec:
  replicas: 2	# 通过修改 replicas: 2 的数量
  selector:
    name: nginx
  template:
    metadata:
      labels:
        name: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.18
          ports:
            - containerPort: 80
EOF
1> 修改yaml文件
[root@k8s-master1 yaml] vim myweb.yaml
	···
spec:
  replicas: 2
	···
2> 命令行跳转修改配置
[root@k8s-master1 yaml] kubectl edit RC myweb
	···
spec:
  replicas: 2
	···
3> scale 修改(推荐)
  • 非交互式
# 支持更改类型
deployment     --replicas=     replicaset       replicationcontroller  statefulset

# 扩容到10个
[root@k8s-master1 yaml] kubectl scale replicationcontroller myweb --replicas=10

# 缩容到1个
[root@k8s-master1 yaml] kubectl scale replicationcontroller myweb --replicas=1
2)滚动升级的三种方式
  • 不但提供了更新服务,而且通常还提供了滚动进度查询、滚动历史记录、以及最重要的回滚等能力,通俗的说,就是具有系统或软件的主动降级的能力。

  • 滚动升级实现方式:开始升级后,删除v1版本的RC,保留v2版本;然后每隔十秒逐步增加v2版本的Pod副本数,逐步减少v1的Pod副本数,先加后减,升级完成后,保留了v2,也删除了v1。

  • 支持断点升级:自动记录上次失败的位置点,可选择继续升级或回退

1> 方式1:修改yaml配置文件
[root@k8s-master1 ~] kubectl edit daemonsets.apps zabbix-agent 
daemonset.apps/zabbix-agent edited
2> 方式2:打标签的方式
[root@k8s-master1 ~] kubectl patch daemonsets.apps zabbix-agent  -p '{"spec":{"template":{"spec":{"containers":[{"image":"zabbix/zabbix-agent:centos-5.2.4", "name":"zabbix-agent"}]}}}}'
daemonset.apps/zabbix-agent patched
3> 方式3:命令行直接升级
[root@k8s-master1 ~] kubectl set image daemonset/zabbix-agent zabbix-agent=zabbix/zabbix-agent:centos-5.2.3

daemonset.apps/zabbix-agent image updated
3)回滚降级的两种方式
  • 在集群中所有的节点上部署只部署一个Pod
cat > nginx_jiangji.yaml <<EOF
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.16.0
EOF
1> 回滚到上一个版本
[root@k8s-master1 ~] kubectl rollout undo daemonset zabbix-agent 
daemonset.apps/zabbix-agent rolled back
2> 回滚到指定版本
[root@k8s-master1 ~] kubectl rollout undo daemonset zabbix-agent --to-revision=1
daemonset.apps/zabbix-agent rolled back

五、Service 资源

Service是k8s中的一个重要概念与核心资源之一,主要提供负载均衡与自动发现,每一个Service就是一个“微服务”。

1.分布流程

1)举例来说:
  • 在非k8s的世界里,用户通过前端的 backend(即前端的微服务Pod)来访问后端的frontend(即后端的微服务Pod)时,运维可以通过在配置文件中指定ip与主机名,来允许用户访问;在在k8s里是行不通的,因为Pod是由生命周期的,它们可以被创建/销毁,虽能通过控制器可以动态创建Pod,但Pod被分配到某个节点时,也会为其分配一个ip,而该ip是不固定的,所以不稳定也不能被依赖;因此在k8s里,可以解决这个问题,技能满足Pod的生命轮回,也能保证用户访问一个固定的ip,图内为访问流程。
    在这里插入图片描述
2)通过上图分析:
  • 最终我们的系统是由多个提供不同业务能力、且彼此独立的微服务单元组成,服务之间通过TCP/IP来通信,形成了强大灵活的弹性网络,拥有强大的分布式能力+弹性扩展能力+容错能力!
3)简单定义Service
cat > Service.yaml <<EOF
kind: Service
apiVersion: v1
metadata:
  name: test-service
  namespace: default
  labels:
    app: test-service
spec:
  type: ClusterIP
  selector:
    app: test-service
ports:
    - port: 80
      targetPort: 80
EFO

2.Service 的四种类型

  • Service 是 Kubernetes 对外访问的窗口,针对不同的场景,kubernetes 为我们设置了四种 Service 的类型

    • ClusterIP
    • NodePort
    • LoadBalancer
    • ExternalName
      在这里插入图片描述
1)ClusterIP(默认)
  • 向集群内部暴露一个IP,集群内部访问的方式,外部无法访问,主要用于为集群内部的Pod访问时,提供的固定访问地址,默认自动分配地址,可使用ClusterIP关键字指定IP
1> 编写文件
cat > ClusterIP.yaml <<EOF
kind: Service
apiVersion: v1
metadata:
  name: my-svc
spec:
  type: ClusterIP
  selector:
    app: nginx
  ports:
    - port: 80
      targetPort: 80
EOF
2> 运行测试
# 运行测试
[root@k8s-master1 yaml]# kubectl apply -f clusterip.yaml
service/my-svc created

# 获取Service信息
[root@k8s-master1 yaml]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11d
my-svc ClusterIP 10.96.222.172 <none> 80/TCP 21s
nginx NodePort 10.96.6.147 <none> 80:42550/TCP 11m

# Curl一下地址,访问成功
[root@k8s-master1 yaml]# curl 10.96.6.147
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
	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>
2)NodePort
  • 在宿主主机中开启一个端口与负载均衡IP的端口一一对应,外界可以使用宿主主机的端口访问集群内部服务。
1> 编写文件
cat > nodeport.yaml <<EOF
kind: Service
apiVersion: v1
metadata:
  name: my-svc
spec:
  type: NodePort
  selector:
	app: nginx
  ports:
	- port: 80
	  targetPort: 80
	  nodePort: 30080
EOF
2> 运行测试
# 运行测试
[root@k8s-master1 yaml]# kubectl apply -f nodeport.yaml
service/my-svc created

# 获取状态
[root@k8s-master1 yaml]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11d
my-svc NodePort 10.96.159.234 <none> 80:30080/TCP 12s
nginx NodePort 10.96.6.147 <none> 80:42550/TCP 17m

# Curl一下地址,访问成功
[root@k8s-master1 yaml]# curl 192.168.12.71:30080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
	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>
3)LoadBalancer
  • 是实现暴露服务的另一种解决方案,它依赖于公有云弹性IP实现
1> 编写文件
cat > nginx.yaml <<EOF
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer
spec:
  type: LoadBalancer
  ports:
	- port: 80
	  targetPort: 80
  selector:
	app: nginx
EOF
2> 运行测试
# 运行测试
[root@k8s-master1 yaml]# kubectl apply -f LoadBalancer.yaml
service/my-svc created

# 获取状态
[root@kubernetes-node-01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 110d
loadbalancer LoadBalancer 10.0.129.18 81.71.12.240 80:30346/TCP 11s
4)ExternalName(外部名)
  • ExternalName:将其他链接设置一个集群内部的别名,与service同步创建、同步删除。
  • 是Service的一个特例,没有选择器,也没有定义端口、Endpoints(端点),作用是返回集群外Service的外部别名,将外部地址经过集群内部的再一次封装,实际上就是集群DNS服务器将cname(地名)解析到了外部地址上,从而实现了集群内部访问。
  • 例如你们公司的镜像仓库,最开始是用 ip 访问,等到后面域名下来了再使用域名访问;你不可能去修改每处的引用,但是可以创建一个 ExternalName,首先指向到 ip,等后面再指向到域名。
1> 编写文件
kind: Service
apiVersion: v1
metadata:
  name: my-svc
spec:
  type: ExternalName
  externalName: www.baidu.com

六、控制器

  • 本章节主要围绕两大功能:扩容缩容+升级回滚

  • Pod通过控制器实现应用的运维,如伸缩、升级等,控制器决定了创建pod资源的方式和类型,在集群上管理和运行容器的对象通过label-selector 相关联。

  • 控制器又称之为工作负载,分别包含以下类型控制器:

    • Deployment
    • Daemonset
    • Statufluset
    • Job
    • CronJob

1.Deployment

  • Deployment主要是保证有足够的Pod正常对外提供服务。
  • 特点:
    • 部署无状态应用,只关心数量,不论角色等,称无状态
    • 管理Pod和ReplicaSet
    • 具有上线部署、副本设定、滚动升级、回滚等功能
    • 提供声明式更新,例如只更新一个新的image
  • 应用场景:
    • web 服务
1)代码部署
1> 代码部署案例
cat > deployment.yaml <<EOF
apiVersion: apps/v1  #kubectl explain deployment查看deployment版本号:apps/v1
kind: Deployment  #类型
metadata:  #元数据
  name: deployment  #deployment的名称
spec:  #定义容器的详细信息
  replicas: 1  #创建Pod的副本数
  selector:  #标签选择器:定义Deployment 如何找到要管理的 Pod,与 template 的 label(标签)对应
    matchLabels: #精确匹配
      release: stable  #对应Pod标签
  template:  #创建Pod的模板---------以下是Pod信息
    metadata:  #Pod元数据
      name: test-tag  #Pod名称(可不定义,随机生成)
      labels:  #标签
        release: stable 
    spec:  #定义容器详细信息
      containers:  #容器列表
        - name: nginx
          image: nginx
EOF
2> 运行部署
[root@k8s-master1 ~]# kubectl apply -f deployment.yaml 
deployment.apps/deployment created

[root@k8s-master1 ~]# kubectl get pod
NAME                          READY   STATUS    RESTARTS   AGE
deployment-5849786498-9nvhp   1/1     Running   0          5s

# 查看部署详情
[root@k8s-master1 ~]# kubectl describe deployments.apps 
Name:                   deployment
Namespace:              default
CreationTimestamp:      Fri, 02 Apr 2021 19:59:13 +0800
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               release=stable
Replicas:               1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  release=stable
  Containers:
   nginx:
    Image:        nginx
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   deployment-5849786498 (1/1 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  30m   deployment-controller  Scaled up replica set deployment-5849786498 to 1
2)弹性扩容、缩容三种方式

扩容:replicas 的值越大,即为扩容

缩容:replicas 的值越小,即为缩容

方式1:scale命令行指定(推荐)
[root@k8s-master1 ~]# kubectl scale deployment deployment --replicas=4
deployment.apps/deployment scaled

# 执行回车后立即生效
[root@k8s-master1 ~]# kubectl get deployments.apps 
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
deployment   4/4     4            4           51m
方式2:修改配置清单
1.直接编辑yaml文件进行修改
[root@k8s-master1 ~]# vim deployment.yaml
	···
spec:
  replicas: 3  # 修改创建Pod的副本数
  selector:
	···
# 等待启动,已扩容为三个
[root@k8s-master1 ~]# kubectl get deployments.apps 
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
deployment   3/3     3            3           37m

====================================================================================================

2.edit命令行修改配置项,同上效果一样
[root@k8s-master1 ~]# kubectl edit deployments.apps deployment 
	···
spec:
  progressDeadlineSeconds: 600
  replicas: 2
  revisionHistoryLimit: 10
	···
	
# 跟vim编辑yaml配置文件类似,已缩容为2个
[root@k8s-master1 ~]# kubectl get deployments.apps 
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
deployment   2/2     2            2           46m
方式3:打标签指定
[root@k8s-master1 ~]# kubectl patch deployments.apps deployment -p '{"spec":{"replicas":6}}'
deployment.apps/deployment patched

[root@k8s-master1 ~]# kubectl get deployments.apps 
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
deployment   6/6     6            6           56m
3)升级、降级三种方式
  • 降级即为回滚

  • 前提:存在低版本的情况下才可升级

  • 准备低版本配置文件

cat > update_test.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: django
spec:
  replicas: 1
  selector:
    matchLabels:
      app: stable
  template:
    metadata:
      label:
        app:stable
    spec:
      containers:
        - name: nginx1
          image: nginx:1.17.10
EOF
  • 运行pod并查看当前版本
  • 以下三种升降级都基于此1.17.0版本举例测试
# 运行pod查看状态
[root@k8s-master1 ~]# kubectl apply -f update_nginx.yaml 
deployment.apps/django created
[root@k8s-master1 ~]# kubectl get pod
NAME                      READY   STATUS    RESTARTS   AGE
django-54bb9d4cd6-b47km   1/1     Running   0          2m19s

#监控并进入容器查看当前版本号
[root@k8s-master1 ~]# kubectl get pod -w
NAME                      READY   STATUS    RESTARTS   AGE
django-54bb9d4cd6-b47km   1/1     Running   0          116s

# 当前版本号为1.17.0
[root@k8s-master1 ~]# kubectl exec -it django-54bb9d4cd6-b47km bash
root@django-54bb9d4cd6-b47km:/# nginx -v
nginx version: nginx/1.17.10
方式1:set image命令行(推荐)
  • kubectl set resources:
    • 可用资源对象包括(支持大小写):replicationcontroller、deployment、daemonset、job、replicaset
    • PS:指定文件中的 kind/name,tab键补不出来
1.升级
#升级到1.18.0
[root@k8s-master1 ~]# kubectl set image Deployment/django nginx1=nginx:1.18.0
deployment.apps/django image updated

# 升级成功
root@django-5c6cfdc7bb-bk644:/# nginx -v
nginx version: nginx/1.18.0

# 查看运行状态
[root@k8s-master1 ~]# kubectl get pod
NAME                      READY   STATUS    RESTARTS   AGE
django-5c6cfdc7bb-bk644   1/1     Running   0          114s
2.降级
  • 同上,将版本号修改为低即可,略~
方式2:修改配置清单
  • 此方式是直接在命令行进入配置清单来修改
  • 同vim来编辑配置清单是一样的,不过vim需要apply -f重载,这里不用!
1.升级
[root@k8s-master1 ~]# kubectl edit deployments.apps django 
	···
	spec:
      containers:
      - image: nginx:1.17.0		# 修改此处版本号
        imagePullPolicy: IfNotPresent
        name: nginx1
	···
deployment.apps/django edited	# 保存后提示编辑成功

# 进入容器查看版本
[root@k8s-master1 ~]# kubectl exec -it django-6cf8df464c-6rp72 bash
root@django-6cf8df464c-6rp72:/# nginx -v 
nginx version: nginx/1.17.0

========================================================================================

# 或用vim修改
[root@k8s-master1 ~]# vim update_nginx.yaml	
      containers:
        - name: nginx1
          image: nginx:1.18.0

# vim需重载更新
[root@k8s-master1 ~]# kubectl apply -f update_nginx.yaml 
deployment.apps/django configured

[root@k8s-master1 ~]# kubectl exec -it django-5c6cfdc7bb-h98xf bash
root@django-5c6cfdc7bb-h98xf:/# nginx -v
nginx version: nginx/1.18.0
2.降级
  • 同上,将版本号修改为低即可,略~
方式3:打标签
  • 此方式较啰嗦,故不推荐
1.升级
# 执行升级命令
[root@k8s-master1 ~]# kubectl patch deployments.apps django -p '{"spec":{"template":{"spec":{"containers":[{"image":"nginx:1.18.0","name":"nginx"}]}}}}' 
deployment.apps/django patched	# 正在修补

# 实时监控
[root@k8s-master1 ~]# kubectl get pod -w
NAME                      READY   STATUS    RESTARTS   AGE
django-6c5b55f69f-m72nc   0/2     ContainerCreating   0          0s
django-54bb9d4cd6-b47km   0/1     Terminating         0          18m
django-6c5b55f69f-m72nc   1/2     Error               0          16s
django-6c5b55f69f-m72nc   2/2     Running             1          17s

# 查看状态运行成功
[root@k8s-master1 ~]# kubectl get pod
NAME                      READY   STATUS    RESTARTS   AGE
django-6c5b55f69f-vghvf   2/2     Running   3          62s

# 进入容器查看版本,升级成功
root@django-6c5b55f69f-m72nc:/# nginx -v
nginx version: nginx/1.18.0
2.降级
  • 同上,将版本号修改为低即可,略~

2.SatefulSet

  • 在集群中所有的节点上部署只部署一个Pod,删除节点自动删除对应得Pod

  • 特点:

    • 部署有状态应用,每台上有且只有一个,不能扩容
    • 解决Pod独立生命周期,保持Pod启动顺序和唯一性
    • 稳定,唯一的网络标识符,持久存储(例如: etcd 配置文件,节点地址发生变化,将无法使用)
    • 有序,优雅的部署和扩展、删除和终止(例如: mysql 主从关系,先启动主,再启动从)
    • 有序,滚动更新
  • 应用场景

    • 数据库
  • 有状态和无状态的区别

    • 无状态:
      1)deployment认为所有的pod都是一样的
      2)不用考虑顺序的要求
      3)不用考虑在哪个node节点上运行
      4)可以随意扩容和缩容
    • 有状态:
      1)实例之间有差别,每个实例都有自己的独特性,元数据不同,例如etcd, zookeeper
      2)实例之间不对等的关系,以及依靠外部存储的应用。
  • 常规service和无头服务区别

    • service: 一组Pod访问策略,提供cluster-IP群集之间通讯,还提供负载均衡和服务发现。
    • Headless service:无头服务,不需要cluster-IP,直接绑定具体的Pod的IP(当Pod的IP地址是动态变化时,所以常用于绑定DNS访问
  • StatefulSet与Deployment区别:

    • StatefulSet创建的pod是有身份的!
      • 身份三要素:
        域名 nginx-statefulset-0.nginx
        主机名 nginx-statefulset-0
        存储 (PVC)

查看版本号

[root@k8s-master1 ~]# kubectl explain DaemonSet|grep -i version
VERSION:  apps/v1

编写配置清单

cat > php.yaml <<EOF
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: php
spec:
  selector:
    matchLabels:
      app: php
  template:
    metadata:
      labels:
        app: php
    spec:
      containers:
        - name: php
          image: php:7.1-fpm
EOF

查看当前版本

# 当前版本为7.1
[root@k8s-master1 ~]# kubectl exec -it php-c8jck bash 
root@php-c8jck:/var/www/html# php -v | grep PHP
PHP 7.1.33 (cli) (built: Nov 22 2019 18:34:33) ( NTS )

# 两台node节点各自动部署了一个
[root@k8s-master1 ~]# kubectl get pod
NAME                      READY   STATUS    RESTARTS   AGE
php-c8jck                 1/1     Running   0          18m
php-x8kbh                 1/1     Running   0          18m
方式1:set image命令行(推荐)
1.升级
# 节点1升级成功
[root@k8s-master1 ~]# kubectl set image daemonset/php php=php:7.4-fpm
[root@k8s-master1 ~]# kubectl exec -it php-92h98 bash
root@php-92h98:/var/www/html# php -v
PHP 7.4.14 (cli) (built: Jan 12 2021 02:26:27) ( NTS )

# 节点2升级成功
[root@k8s-master1 ~]# kubectl exec -it php-rszf8 bash
root@php-rszf8:/var/www/html# php -v
PHP 7.4.14 (cli) (built: Jan 12 2021 02:26:27) ( NTS )
2.降级
  • 同上,将版本号修改为低即可,略~
方式2:edit修改配置
1)升级
[root@k8s-master1 ~]# kubectl edit daemonsets.apps php
	- image: php:7.3-fpm	# 修改为7.3
        imagePullPolicy: IfNotPresent
        name: php
daemonset.apps/php edited	# 提示修改成功

# 节点1升级成功
[root@k8s-master1 ~]# kubectl exec -it php-4xgkr bash
root@php-4xgkr:/var/www/html# php -v
PHP 7.3.26 (cli) (built: Jan 12 2021 02:54:23) ( NTS )

# 节点2升级成功
[root@k8s-master1 ~]# kubectl exec -it php-j24m6 bash
root@php-j24m6:/var/www/html# php -v 
PHP 7.3.26 (cli) (built: Jan 12 2021 02:54:23) ( NTS )
2)降级
  • 同上,将版本号修改为低即可,略~
方式3:打标签
  • 此方式较啰嗦,故不推荐
1.升级
# 升级到7.1
[root@k8s-master1 ~]# kubectl patch daemonsets.apps php -p '{"spec":{"template":{"spec":{"containers":[{"image":"php:7.4-fpm", "name":"php"}]}}}}'

# node1升级成功
[root@k8s-master1 ~]# kubectl exec -it php-5g7z7 bash
root@php-5g7z7:/var/www/html# php -v
PHP 7.4.14 (cli) (built: Nov 22 2019 18:34:33) ( NTS )

# node2升级成功
[root@k8s-master1 ~]# kubectl exec -it php-6kvdl bash
root@php-6kvdl:/var/www/html# php -v
PHP 7.4.14 (cli) (built: Nov 22 2019 18:34:33) ( NTS )
2.降级

同上,将版本号修改为低即可,略~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋风お亦冷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值