K8S-6--集群版本升级/yaml/etcd/kubectl/

一、K8S集群版本升级

注:小版本更新侧重稳定性,大版本更新是功能的变化

1、蓝绿部署(最安全,但耗费较高):

准备完全相同的一套服务器部署所有服务,之后迁移至整个集群。原先集群保留一段时间,新集群稳定后撤掉。

2、滚动升级(推荐):

先下线master1,修改node的nginx配置文件。以轮询的方式升级每个节点的二进制,至少保证一个master节点正常运行

升级注意:
1先在测试环境运行没问题再上生产
2升级过程要保证正常的访问不受影响
3保险起见建议晚上升级

重大升级:
提前72小时通知开发、运维、测试部门;
业务升级:提前24小时;
紧急升级/重大bug:立即升级、立即回滚

#master1上的6个二进制都要升级
[root@k8s-master1 ~]#kube
kube-apiserver    kube-proxy    kubectl     kube-controller-manager    kube-scheduler     kubelet  
#node上的3个二进制都要升级
[root@k8s-node1 ~]#kube
kube-proxy  kubectl     kubelet

#1、官网下载四个二进制文件并在本地解压
https://github.com/kubernetes/kubernetes-->releases-->CHANGELOG-->Downloads for v1.21.5:
[root@k8s-master1 ~]#tar xf kubernetes-client-linux-amd64.tar.gz -C /usr/local/src/
[root@k8s-master1 ~]#tar xf kubernetes-server-linux-amd64.tar.gz -C /usr/local/src/
[root@k8s-master1 ~]#tar xf kubernetes.tar.gz -C /usr/local/src/
[root@k8s-master1 ~]#tar xf kubernetes-node-linux-amd64.tar.gz -C /usr/local/src/
[root@k8s-master1 ~]#ls /usr/local/src/kubernetes/server/bin/
[root@k8s-master1 ~]#/usr/local/src/kubernetes/server/bin/kube-apiserver --version
Kubernetes v1.21.5
[root@k8s-master1 ~]#kube-apiserver --version
Kubernetes v1.21.0
#把该目录的文件更新
[root@k8s-master1 ~]#ls /etc/kubeasz/bin/ 

#2、master升级步骤:
#在每个node节点nginx上下线master1
#master1 上的访问请求通过haproxy转发到另外两个master节点,故不会影响业务访问
[root@k8s-node1 ~]#vim /etc/kube-lb/conf/kube-lb.conf
        server 192.168.150.152:6443    max_fails=2 fail_timeout=3s;
        #server 192.168.150.151:6443    max_fails=2 fail_timeout=3s;
[root@k8s-node1 ~]#systemctl restart kube-lb.service 
		
[root@k8s-master1 ~]#kubectl stop kube-apiserver kube-proxy kube-controller-manager kube-scheduler kubelet
[root@k8s-master1 ~]#cd /usr/local/src/kubernetes/server/bin/
[root@k8s-master1 bin]#\cp kube-apiserver kube-proxy kube-controller-manager kube-scheduler kubelet kubectl /usr/local/bin/ #直接覆盖
[root@k8s-master1 ~]#kubectl start kube-apiserver kube-proxy kube-controller-manager kube-scheduler kubelet

#在node节点上线master1,然后继续升级master2和3.(至少保证一台master是正常运行状态)
[root@k8s-master1 bin]#scp kube-apiserver kube-proxy kube-controller-manager kube-scheduler kubelet kubectl 192.168.150.152:/usr/local/bin/
[root@k8s-master1 bin]#scp kube-apiserver kube-proxy kube-controller-manager kube-scheduler kubelet kubectl 192.168.150.153:/usr/local/bin/

#3、node升级步骤:
[root@k8s-node1 ~]#systemctl stop kubelet kube-proxy
[root@k8s-master1 bin]##scp kubelet kube-proxy kubectl 192.168.150.152:/usr/local/bin/
[root@k8s-node1 ~]#systemctl start kubelet kube-proxy
#验证kubelet的升级成功
[root@k8s-node1 ~]#kubectl get node
NAME              STATUS                     ROLES    AGE   VERSION
192.168.150.161   Ready                      node     42h   v1.21.5

二、yaml文件

在线yaml与json编辑器:
http://www.bejson.com/validators/yaml_editor/

1、json:

json特点:
json不能注释,json可读性较差,json语法很严格
比较适用于API返回值,也可用于配置文件

#json格式:
{"人员名单"{ "张三"{ "年龄":18,"职业""Linux运维工程师""爱好"[ "看书""学习""加班" ] },
    "李四"{ "年龄":20,"职业""Java开发工程师""爱好"[ "开源技术""微服务""分布式存储" ] } } }
2、yaml:

(1)ymal特点:
大小写敏感
使用缩进表示层级关系
缩进时不允许使用Tab键,只允许使用空格
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可,一般缩进2个空格
使用"#”表示注释,从这个字符一直到行尾,都会被解析器忽略
比json更适用于配置文件

yaml文件主要特性:
上下级关系
列表
键值对(也称maps即key:value格式)

(2)必需字段(怎么声明):
1.apiVersion-创建该对象所使用的Kubernetes API的版本
2.kind-想要创建的对象的类型
3.metadata-帮助识别对象唯一性的数据,包括一个name名称、可选的namespace
4.spec
5.status(Pod创建完成后k8s自动生成status状态)

每个API对象都有3大类属性:元数据metadata、规范spec和状态status。
元数据:namespace,name和uid

spec和status的区别:
spec是期望状态,status是实际状态

此外,可用标签env来标识区分不同的服务部署环境,如env=dev、env=testing、env=production

(3)创建namespace的两种方式

#通过命令创建namespace
rootek8s-masterl:~# kubectl create namespace n56
rootek8s-masterl:~# kubectl get ns

#通过yaml文件创建namespace
rootek8s-masterl:~# kubectl explan namespace
rootek8s-masterl:~# vim n56-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: n56
rootek8s-masterl:~# kubectl apply -f n56-namespace.yaml
rootek8s-masterl:~# kubectl get ns

(4)yaml文件详解-以nginx为例

#使用yaml文件创建nginx-namespace:
[root@k8s-master1 nginx]#vim n56-namespace.yaml 
apiVersion: v1
kind: Namespace
metadata:
  name: n56
  
#使用yaml文件创建nginx-pod:
[root@k8s-master1 nginx]#vim nginx.yaml
kind: Deployment  #类型,是deployment控制器,kubectl explain  Deployment
apiVersion: apps/v1  #API版本,# kubectl explain  Deployment.apiVersion
metadata: #pod的元数据信息,kubectl explain  Deployment.metadata
  labels: #自定义pod的标签,# kubectl explain  Deployment.metadata.labels
    app: n56-nginx-deployment-label #标签名称为app值为n56-nginx-deployment-label,后面会用到此标签 
  name: n56-nginx-deployment #pod的名称
  namespace: n56 #pod的namespace,默认是defaule
spec: #定义deployment中容器的详细信息,kubectl explain  Deployment.spec
  replicas: 1 #创建出的pod的副本数,即多少个pod,默认值为1
  selector: #定义标签选择器
    matchLabels: #定义匹配的标签,必须要设置
      app: n56-nginx-selector #匹配的目标标签,
  template: #定义模板,必须定义,模板是起到描述要创建的pod的作用
    metadata: #定义模板元数据
      labels: #定义模板label,Deployment.spec.template.metadata.labels
        app: n56-nginx-selector #定义标签,等于Deployment.spec.selector.matchLabels
    spec: 
      containers:
      - name: n56-nginx-container #容器名称
        image: nginx:1.16.1
        #command: ["/apps/tomcat/bin/run_tomcat.sh"] #容器启动执行的命令或脚本
        #imagePullPolicy: IfNotPresent
        imagePullPolicy: Always #拉取镜像策略
        ports: #定义容器端口列表
        - containerPort: 80 #定义一个端口
          protocol: TCP #端口协议
          name: http #端口名称
        - containerPort: 443 #定义一个端口
          protocol: TCP #端口协议
          name: https #端口名称
        env: #配置环境变量
        - name: "password" #变量名称。必须要用引号引起来
          value: "123456" #当前变量的值
        - name: "age" #另一个变量名称
          value: "18" #另一个变量的值
        resources: #对资源的请求设置和限制设置
          limits: #资源限制设置,上限
            cpu: 500m  #cpu的限制,单位为core数,可以写0.5或者500m等CPU压缩值
            memory: 512Mi #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
          requests: #资源请求的设置
            cpu: 200m #cpu请求数,容器启动的初始可用数量,可以写0.5或者500m等CPU压缩值
            memory: 256Mi #内存请求大小,容器启动的初始可用数量,用于调度pod时候使用
      nodeSelector:
        group: python57

##使用yaml文件创建nginx-service:
[root@k8s-master1 nginx]#vim nginx-svc.yaml
kind: Service #类型为service
apiVersion: v1 #service API版本,service.apiVersion
metadata: #定义service元数据,service.metadata
  labels: #自定义标签,service.metadata.labels
    app: n56-nginx #定义service标签的内容
  name: n56-nginx-service #定义service的名称,此名称会被DNS解析
  namespace: n56 #该service隶属于的namespaces名称,即把service创建到哪个namespace里面
spec: #定义service的详细信息,service.spec
  type: NodePort #service的类型,定义服务的访问方式,默认为ClusterIP, service.spec.type
  ports: #定义访问端口, service.spec.ports
  - name: http #定义一个端口名称
    port: 81 #service 80端口
    protocol: TCP #协议类型
    targetPort: 80 #目标pod的端口
    nodePort: 30001 #node节点暴露的端口
  - name: https #SSL 端口
    port: 1443 #service 443端口
    protocol: TCP #端口协议
    targetPort: 443 #目标pod端口
    nodePort: 30043 #node节点暴露的SSL端口
  selector: #service的标签选择器,定义要访问的目标pod
    app: n56-nginx-selector #将流量路到选择的pod上,须等于Deployment.spec.selector.matchLabels

#service建议和pod分开写两个文件
#service的app必须与pod一致

#执行yaml文件
[root@k8s-master1 nginx]#kubectl apply -f n56-namespace.yaml -f nginx.yaml -f nginx-svc.yaml
[root@k8s-master1 nginx]#kubectl apply -f .
#验证创建情况
[root@k8s-master1 yaml]#kubectl get ns
NAME              STATUS   AGE
default           Active   6d20h
n56               Active   17m
[root@k8s-master1 yaml]#kubectl get svc -n n56
NAME                TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)                       AGE
n56-nginx-service   NodePort   10.100.243.230   <none>        81:30001/TCP,1443:30043/TCP   4m58s
[root@k8s-master1 yaml]#kubectl get pod -n n56
NAME                                    READY   STATUS    RESTARTS   AGE
n56-nginx-deployment-857fc5cb7f-nnv4f   0/1     Pending   0          6m7s
[root@k8s-master1 yaml]#kubectl get pod -n n56 -o wide
NAME                                    READY   STATUS    RESTARTS   AGE     IP       NODE     NOMINATED NODE   READINESS GATES
n56-nginx-deployment-857fc5cb7f-nnv4f   0/1     Pending   0          6m32s   <none>   <none>   <none>           <none>

#!!!报错:pod起不来!!!
[root@k8s-master1 ~]#kubectl describe pod n56-nginx-deployment-857fc5cb7f-6sjss -n n56
Events:
  Type     Reason            Age                From               Message
  ----     ------            ----               ----               -------
  Warning  FailedScheduling  66s (x2 over 67s)  default-scheduler  0/3 nodes are available: 1 node(s) were unschedulable, 2 node(s) didn't match Pod's node affinity/selector.
#!!!解决:
#查看node节点
[root@k8s-master1 yaml]#vim nginx.yaml
      nodeSelector:
        group: python57 #设置了绑定的node节点的标签,即亲和性,但经查询node节点未设置改标签,故无法绑定创建。
[root@k8s-master1 yaml]#kubectl describe node 192.168.150.161
[root@k8s-master1 yaml]#kubectl describe node 192.168.150.162
解决办法1:删除nginx.yaml文件的亲和性配置
解决办法2:给node节点设置标签,如下
[root@k8s-master1 ~]#kubectl label node 192.168.150.162 group=python57
[root@k8s-master1 yaml]#kubectl describe nodes 192.168.150.162
 Labels:      group=python57
[root@k8s-master1 yaml]#kubectl delete -f nginx.yaml
[root@k8s-master1 yaml]#kubectl apply -f nginx.yaml
[root@k8s-master1 yaml]#kubectl get pod -n n56 -o wide
NAME                                  READY   STATUS    RESTARTS   AGE   IP               NODE              NOMINATED NODE   READINESS GATES
n56-nginx-deployment-d986757c-7clqm   1/1     Running   0          12s   10.200.169.131   192.168.150.162   <none>           <none>
[root@k8s-master1 yaml]#kubectl describe pod n56-nginx-deployment-d986757c-7clqm -n n56
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  43s   default-scheduler  Successfully assigned n56/n56-nginx-deployment-d986757c-7clqm to 192.168.150.162
  Normal  Pulling    42s   kubelet            Pulling image "nginx:1.16.1"
  Normal  Pulled     37s   kubelet            Successfully pulled image "nginx:1.16.1" in 5.435563594s
  Normal  Created    37s   kubelet            Created container n56-nginx-container
  Normal  Started    37s   kubelet            Started container n56-nginx-container

三、etcd

1、etcd简介

官网:https://etcd.io/
git地址:github:https://github.com/etcd-io/etcd
官方硬件推荐:https://etcd.io/docs/v3.4/op-guide/hardware/
为 Kubernetes 运行 etcd 集群:
https://kubernetes.io/zh/docs/tasks/administer-cluster/configure-upgrade-etcd/

(1)etcd保存了整个集群的状态(ectd很重要一定要做好备份,做高可用至少三台)
(2)etcd硬件配置:建议固态硬盘SSD;物理机。
(3)etcd是CoreOS团队于2013年6月发起,基于Go语言实现,目前Kubermetes默认使用的高可用的分布式键值(key-value)数据库,支持分布式集群功能。

2、etcd特性

Etcd具有下面这些属性:
完全复制:集群中的每个节点都可以使用完整的存档
高可用性:Etcd可用于避免硬件的单点故障或网络问题
一致性:每次读取都会返回跨多主机的最新写入
简单:包括一个定义良好、面向用户的API(gRPc)
安全:实现了带有可选的客户端证书身份验证的自动化TLS
快速:每秒10000次写入的基准速度
可靠:使用Raft算法实现了存储的合理分布Etcd的工作原理

中间件
复制式集群(镜像式集群):mysql,redis哨兵、etcd、zookeeper
分片式集群:kafka,redis cluster,elasticsearch

3、etcd版本

etcd有多个不同的APl访问版本,v1版本已经废弃,etcd v2和v3数据互相隔离:

WARNING:
Environment variable ETCDCTLAPI is not set;defaults to etcdctl v2.#默认使用V2版本
Set environment variable ETCDCTL API=3 to use V3 API or ETCDCTL_API=2 to use v2API.#设置API版本

相比Etcd v2,Etcd v3的一些主要变化:
(1)接口通过grpc提供rpc接口,放弃了v2的http接口,优势是长连接效率提升明显,缺点是使用不如以前方便,尤其对不方便维护长连接的场景。
(2)废弃了原来的目录结构,变成了纯粹的kv,用户可以通过前缀匹配模式模拟目录。
(3)内存中不再保存value,同样的内存可以支持存储更多的key。
watch机制更稳定,基本上可以通过watch机制实现数据的院全同步。
(4)提供了批量操作以及事务机制,用户可以通过批量事务请求来实现Etcd v2的CAs机制(批量事务支持if条件判断)。

4、etcd相关命令

登录人员:master和etcd专门人员密钥登录,监控人员等无权限。

[root@k8s-etcd1 ~]#etcdctl -h

#1、显示集群成员信息
[root@k8s-etcd1 ~]#etcdctl member list
e49e8661cfdfd6b6, started, etcd-192.168.150.156, https://192.168.150.156:2380, https://192.168.150.156:2379, false
#--write-out=table以表格格式输出
[root@k8s-etcd1 ~]#etcdctl member list --write-out=table  
+------------------+---------+----------------------+------------------------------+------------------------------+------------+
|        ID        | STATUS  |         NAME         |          PEER ADDRS          |         CLIENT ADDRS         | IS LEARNER |
+------------------+---------+----------------------+------------------------------+------------------------------+------------+
| e49e8661cfdfd6b6 | started | etcd-192.168.150.156 | https://192.168.150.156:2380 | https://192.168.150.156:2379 |      false |
+------------------+---------+----------------------+------------------------------+------------------------------+------------+

#2、心跳信息/健康状态
[root@k8s-etcd1 ~]#etcdctl endpoint health
127.0.0.1:2379 is healthy: successfully committed proposal: took = 8.801764ms
#显示节点详细状态
[root@k8s-etcd1 ~]#etcdctl endpoint status
127.0.0.1:2379, e49e8661cfdfd6b6, 3.4.13, 4.2 MB, true, false, 8, 187486, 187486, 

#3、etcd增删改查数据:
#查看所有key:
[root@k8s-etcd1 ~]#etcdctl get / --prefix --keys-only
[root@k8s-etcd1 ~]#etcdctl get / --prefix --keys-only |grep pod
[root@k8s-etcd1 ~]#etcdctl get / --prefix --keys-only |grep node
[root@k8s-etcd1 ~]#etcdctl get / --prefix --keys-only |grep namespace
[root@k8s-etcd1 ~]#etcdctl get / --prefix --keys-only |grep deployment
[root@k8s-etcd1 ~]#etcdctl get / --prefix --keys-only |grep calico
#查看指定key:
[root@k8s-etcd1 ~]#etcdctl get /calico  #所有值
[root@k8s-etcd1 ~]#etcdctl get /calico --prefix --keys-only  #只显示key
[root@k8s-etcd1 ~]#etcdctl get /calico --prefix --keys-only |grep default  #过滤
#添加值/删除值
[root@k8s-etcd1 ~]#etcdctl put /name "tom"
OK
[root@k8s-etcd1 ~]#etcdctl get /name 
/name
tom
[root@k8s-etcd1 ~]#etcdctl put /name "jack"
OK
[root@k8s-etcd1 ~]#etcdctl get /name 
/name
jack
[root@k8s-etcd1 ~]#etcdctl del /name 
[root@k8s-etcd1 ~]#etcdctl del /name "jack"

#删除pod的两种方法
[root@k8s-etcd1 ~]#ETCDCTL_API=3 /usr/bin/etcdctl del /registry/pods/default/net-test1
[root@k8s-master1 ~]#kubectl delete pod net-test1 -n default

#4、etcd数据watch机制:
#基于不断监看数据,发生变化就主动触发通知客户端,Etcdv3的watch机制支持watch某个固定的key,也支持watch一个范围。
[root@k8s-etcd1 ~]#etcdctl put /name "all"
OK
[root@k8s-etcd1 ~]#etcdctl del /name 
1
[root@k8s-etcd1 ~]#etcdctl watch /name
PUT
/name
all
DELETE
/name

#5、etcd数据的备份和恢复机制
#WAL是write ahead log的缩写,顾名思义,也就是在执行真正的写操作之前先写一个日志,预写日志。
#wal:存放预写式日志,最大的作用是记录了整个数据变化的全部历程。在etcd中,所有数据的修改在提交前,都要先写入到WAL中。

#(1)etcd v2版本数据备份与恢复:(无环境)
#v2版本备份数据:
root@k8s-etcd2:~#/usr/bin/etcdct1 backup --help
root@k8s-etcd2:~#ETCDCTL_API=2 etcdctl backup --data-dir /var/lib/etcd/ --backup-dir /opt/etcd_backup
#V2版本恢复数据:
root@k8s-etcd2:~#etcd --help | grep force 
	--force-new-cluster'false'
	force to create a new one-member cluster.
	etcd --data-dir=/var/1ib/etcd/default.etcd --force-new-cluster &
root@k8s-etcd2:~#vim /etc/systemd/system/etcd.service
   --data-dir=/opt/etcd_backup -force-new-cluster #强制设置为新集群
   
#(2)etcd 集群v3版本数据手动备份与恢复:
[root@k8s-etcd1 ~]#etcdctl snapshot save snapshot.db
[root@k8s-etcd1 ~]#etcdctl snapshot restore snapshot.db --data-dir=/opt/etcd-testdir
#通过脚本每天自动备份数据
[root@k8s-etcd1 ~]#mkdir /data/etcd-backup-dir/ -p
[root@k8s-etcd1 ~]#cat script.sh 
#!/bin/bash 
source /etc/profile 
DATE=`date +%Y-%m-%d_%H-%M-%S` 
ETCDCTLAPI=3 /usr/bin/etcdctl snapshot save /data/etcd-backup-dir/etcd-snapshot-${DATE}.db

#(3)etcd 集群v3版本数据自动备份与恢复:
[root@k8s-master1 ~]#ezctl backup k8s-01
[root@k8s-master1 ~]#kubectl delete pod net-test4
[root@k8s-master1 ~]#ezctl restore k8s-01

#(4)ETCD数据恢复流程
当etcd集群宕机数量超过集群总节点数一半以上的时候(如总数为三台宕机两台),就会导致整合集群宕机,后期需要重新恢复数据

恢复流程如下:
1、恢复服务器系统
2、重新部署ETCD集群
3、停止kube-apiserver/controller-manager/scheduler/kubelet/kube-proxy
4、停止ETCD集群
5、各ETCD节点恢复同一份备份数据
6、启动各节点并验证ETCD集群
7、启动kube-apiserver/controller-manager/scheduler/kubelet/kube-proxy
8、验证k8s master状态及pod数据

#6、标准使用/多集群
#标准使用:
[root@k8s-etcd1 ~]#ETCDCTL_API=3 /usr/bin/etcdctl put/get/snapshot/..
#多集群:
#显示集群成员信息
[root@k8s-etcd1 ~]#ETCDCTL_API=3 /usr/bin/etcdctl --write-out=table member list --endpoints=https://172.31.7.106:2379 --cacert=/etc/kubernetes/ss1/ca.pem --cert=/etc/kubernetes/ss1/etcd.pem --key=/etc/kubernetes/ss1/etcd-key.pem
#心跳信息
[root@k8s-etcd1 ~]#export NODE_IPS="172.31.7.106 172.31.7.107 172.31.7.108"
[root@k8s-etcd1 ~]#for ip in ${NODE_IPS};do ETCDCTL_API=3 /usr/bin/etcdctl --endpoints=https://${ip}:2379 --cacert=/etc/kubernetes/ss1/ca.pem --cert=/etc/kubernetes/ss1/etcd.pem --key=/etc/kubernetes/ss1/etcd-key.pem endpoint health; done
#显示节点详细状态
[root@k8s-etcd1 ~]#export NODE_IPS="172.31.7.106 172.31.7.107 172.31.7.108"
[root@k8s-etcd1 ~]#for ip in ${NODE_IPS};do ETCDCTL API=3 /usr/bin/etcdctl --write-out=table endpoint status --endpoints=https://${ip}:2379 --cacert=/etc/kubernetes/ss1/ca.pem --cert=/etc/kubernetes/ss1/etcd.pem --key=/etc/kubernetes/ssl/etcd-key.pem; done

四、k8s集群维护常用命令-kubectl

kubectl依赖于文件/etc/.kube/config
kubectl常用命令:
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands

1、常用命令:
create/delete/edit/get/describe/logs/exec/scale增删改查
	  edit直接生效,但不保存在配置文件,执行apply yaml会被覆盖,不建议这样改
	  describe查看某个资源详细信息
	  scale修改副本数
explain命令说明
label:给node标记label,实现亲pod与node亲和性标签管理(一个pod可以打多个label标签)
apply动态配置
cluster-info/top集群状态
node节点管理相关:
	  cordon:警戒线,标记node不被调度,常用于master及配置在负载均衡后的服务器等不运行pod的节点
	  uncordon:取消警戒标记为cordon的node
	  drain:驱逐node上的pod,用于node下线等场景
	  taint:给node标记污点,实现反亲pod与node反亲和性(先在B上创建A pod上的容器,再整个删除A pod)
api-resources/api-versions/version api资源
config 生成kube-config文件
logs 看pod所启动的容器的输出日志信息
2、示例:
#kubectl get svc --all-namespaces -o wide
#kubectl get pods --all-namespaces -o wide
#kubectl get nodes --all-namespaces -o wide
#kubectl get deployment --all-namespaces
#kubectl get deployment -n magedu -o wide #更改显示格式
#kubectl describe pods magedu-tomcat-app1-deployment -n magedu #查看某个资源详细信息
#kubectl create -f tomcat-appl.yaml
#kubectl apply -f tomcat-app1.yaml
#kubectl delete -f tomcat-app1.yaml
#kubectl create -f tomcat-appl.yaml --save-config --record
#kubectl apply -f tomcat-appl.yaml --record #推荐命令
#kubectl exec -it magedu-tomcat-app1-deployment-6bccd8f9c7-g76s5 bash -n magedu
#kubectl logs magedu-tomcat-app1-deployment-6bccd8f9c7-g76s5 -n magedu
#kubectl delete pods magedu-tomcat-app1-deployment-6bccd8f9c7-g76s5 -n magedu
#kubectl scale -n n56 deployment/n56-nginx-deployment --replicas=3 #修改副本数为3
#kubectl cordon 192.168.150.151 
#kubectl get node #验证
#kubectl uncordon 192.168.150.151  
#kubectl drain 172.31.7.112 --force --ignore-daemonsets --delete-emptydir-data #驱逐node上所有pod到其他的node节点
#kubectl api-resources #看短称、api版本
#kubectl top node/pod (需安装Metrics API)
#把pod创建在指定的node服务器上
#亲和性
#1、打标签
[root@k8s-master1 ~]#kubectl label node 192.168.150.161 project=linux56
node/192.168.150.161 labeled
[root@k8s-master1 ~]#kubectl describe node 192.168.150.161
Labels:    project=linux56
#2、编辑yaml文件
[root@k8s-master1 ~]#vim nginx.yaml
    nodeSelector:
      project: linux56
#查询怎么写
[root@k8s-master1 ~]#kubectl explain deployment.spec.template.spec
#3、执行创建及验证
[root@k8s-master1 ~]#kubectl apply -f nginx.yaml
[root@k8s-master1 ~]#kubectl get pod -n n56 -o wide
3、注意事项:

(1)注意一些别称,比如:-A=–all-namespace service=svc
(2)排查pod报错,看pod events或是logs

#kubectl describe pods magedu-tomcat-app1-deployment -n magedu #看Events信息
#kubectl logs magedu-tomcat-app1-deployment-6bccd8f9c7-g76s5 -n magedu

(3)镜像升级(create和apply的区别)

#create创建后无法执行apply升级,需要删除后重新apply创建或是create --save-config创建;
#apply创建后直接执行apply升级即可

(4)命令delete删除后会自动新建一个pod,因为yaml文件副本数为1。建议删除用yaml文件删除。
(5)不建议使用logs查看,建议使用elk收集日志

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值