一、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收集日志