Docker+K8S+DevOps微服务架构师

学神IT教育:从零基础到实战,从入门到精通!

版权声明:

  1. 本系列文档为《学神IT教育》内部使用教材和教案,只允许VIP学员个人使用,禁止私自传播。否则将取消其VIP资格,追究其法律责任,请知晓!
免责声明: 本课程设计目的只用于教学,切勿使用课程中的技术进行违法活动,学员利用课程中的技术进行违法活动,造成的后果与讲师本人及讲师所属机构无关。倡导维护网络安全人人有责,共同维护网络文明和谐。

联系方式:

学神IT教育官方网站: http://www.xuegod.cn

学神K8S精英学习11群QQ群: 957231097

5-使用kubectl管理Kubernetes容器平台-笔记-v12 - 图1 5-使用kubectl管理Kubernetes容器平台-笔记-v12 - 图2 5-使用kubectl管理Kubernetes容器平台-笔记-v12 - 图3

学习顾问:小语老师 学习顾问:边边老师 学神微信公众号

微信扫码添加学习顾问微信,同时扫码关注学神公众号了解最新行业动态,获取更多学习资料及答疑就业服务!

第十一章 使用kubectl管理Kubernetes容器平台

本节所讲内容:

11.1 kubectl概述

11.2 kubectl创建和删除一个pod相关操作

11.3 yaml语法规则

11.4 kubectl create加载yaml文件生成deployment设备资源

11.5 kubectl其他常用命令和参数说明

11.6 使用kubectl管理集群中deployment资源和service服务

11.1 kubectl概述

kubectl是一个用于操作kubernetes集群的命令行接口,通过利用kubectl的各种命令可以实现各种功能。

实验环境说明:

使用之前已经安装好的kubernetes集群平台

1. 实验拓扑图

5-使用kubectl管理Kubernetes容器平台-笔记-v12 - 图4

当前集群构成如下:

环境说明(centos7.6):

IP 主机名 角色 内存

192.168.1.63 xuegod63 master 4G

192.168.1.62 xuegod62 worker 4G

192.168.1.64 xuegod64 worker 4G

[root@xuegod63 ~]# kubectl get nodes

5-使用kubectl管理Kubernetes容器平台-笔记-v12 - 图5

2. 查看版本: [root@xuegod63 ~]# kubectl version

11.2 kubectl创建和删除一个pod相关操作

命令 说明
run 在集群上运行一个pod
create 使用文件或者标准输入的方式创建一个pod
delete 使用文件或者标准输入来删除某个pod

11.2.1 在集群上运行一个镜像

提前将镜像docker.io-nginx.tar

上传到node1和node2上并导入镜像。

登录xuegod62,开始上传:

5-使用kubectl管理Kubernetes容器平台-笔记-v12 - 图6

[root@xuegod62 ~]# scp docker.io-nginx.tar 192.168.1.64:/root/

如果node1和node2服务器上没有docker.io-nginx.tar镜像,后期使用时会自动从外网上下载此镜像,这样比较慢,所以我们提前上传到服务器上。

[root@xuegod62 ~]# docker load -i docker.io-nginx.tar

[root@xuegod64 ~]# docker load -i docker.io-nginx.tar

11.2.2 kubectl run 语法

kubectl run和docker run一样,kubectl run能将一个pod运行起来。

语法:

kubectl run podNAME —image=image [—env=”key=value”] [—port=port]

查看k8s平台,没有pod,是一个干净的平台,这样方便后期操作:

[root@xuegod63 ~]# kubectl get deployment

No resources found in default namespace.

[root@xuegod63 ~]# kubectl get pod

No resources found in default namespace.

例1:创建一个名字为nginx的pod,使用刚上传到node1和2上的nginx:latest镜像 ,—port=暴露容器端口 80 。

[root@xuegod63 ~]# kubectl run nginx —image=nginx:latest —image-pull-policy=’IfNotPresent’ —port=80

pod/nginx created

[root@xuegod63 ~]# kubectl get pod

NAME READY STATUS RESTARTS AGE

nginx 1/1 Running 0 7s

注:如果node结点上nginx:latest镜像没有,那么node1和node2会自动从docker镜像站点上下载。也可以改成自己的私有仓库地址:—image=192.168.1.63:5000/nginx:1.12。

—image-pull-policy=’IfNotPresent’ # 如果本地不存在镜像,那么才从外网下载镜像。 默认值为:imagePullPolicy: Always一直从外网,下载镜像,不用使用本地的。

查看生成的pod,kubernetes将容器运行在pod中以方便实施卷和网络共享等管理

[root@xuegod63 ~]# kubectl get pod

NAME READY STATUS RESTARTS AGE

nginx 1/1 Running 0 117s

pods常见的状态:

  1. ContainerCreating #容器创建

  2. ImagePullBackOff #从后端把镜像拉取到本地

注:如果这里pod没有正常运行,都是因为docker hub没有连接上,导致镜像没有下载成功,这时,可以在node节点上把相关镜像手动上传一下或把docker源换成阿里云的。
  1. terminating [‘tɜ:mɪneɪtɪŋ] #终止 。当删除pod时的状态

  2. Running 正常运行状态

11.2.3 使用kubectl delete删除创建的对象

  1. 删除pod

语法:kubectl delete pod pod名字

[root@xuegod63 ~]# kubectl delete pod nginx

pod “nginx” deleted

[root@xuegod63 ~]# kubectl get pod

No resources found in default namespace.

11.3 yaml语法规则

YAML 语言(发音 /ˈjæməl/ )的设计目标,就是方便人类读写。它实质上是一种通用的数据串行化格式。

  1. yaml配置文件常见单词:
kind: 同类,类型 ; apiVersion API版本 ; metadata 元数据 ; spec: 规格,说明书(定义具体参数) ; replicas [ˈreplɪkəs] : 副本 selector [sɪˈlektə(r)] 选择器 ; template [ˈtempleɪt] 模板
  1. yaml语法的基本语法规则如下:

1、大小写敏感

2、使用缩进表示层级关系

3、缩进时不允许使用Tab键,只允许使用空格。

4、缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

5、# 表示注释,从这个字符一直到行尾,都会被解析器忽略。

6、在yaml里面,连续的项目(如:数组元素、集合元素)通过减号“-”来表示,map结构里面的键值对(key/value)用冒号“:”来分割。

  1. YAML 支持的数据结构有三种

对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)

数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)

纯量(scalars):单个的、不可再分的值

  1. 数据结构—对象

对象的一组键值对,使用冒号结构表示。

例1:animal代表 pets # pet [pet] 宠物

animal: pets

例2:website网址对象中包括 baidu和qq, 且 baidu对象的值为:http://www.baidu.com,QQ对象的值为:http://www.qq.com 。这一句话,使用yaml语言,描述为:

website:

baidu: http://www.baidu.com

qq: http://www.qq.com

或写成一行:

website:{ baidu: http://www.baidu.comqq: http://www.qq.com }

注:Yaml 也允许另一种写法,将所有键值对写成一个行内对象。

  1. 数组

一组连词线开头的行,构成一个数组。

animal:

  • Cat

  • Dog

  • Goldfish

转为 JavaScript 如下。

[ ‘Cat’, ‘Dog’, ‘Goldfish’ ]

数据结构的子成员是一个数组,则可以在该项下面缩进一个空格。数组中还有数组。

-

  • Cat

  • Dog

  • Goldfish

转为 JavaScript 如下。

[ [ ‘Cat’, ‘Dog’, ‘Goldfish’ ] ]

数组也可以采用行内表示法。

animal: [Cat, Dog]

转为 JavaScript 如下。

{ animal: [ ‘Cat’, ‘Dog’ ] }

  1. 复合结构

对象和数组可以结合使用,形成复合结构。

例:编写一个包括BAT基本信息的bat.yaml配置文件

bat:

website:

baidu: http://www.baidu.com

qq: http://www.qq.com

ali:

- http://www.taobao.com - http://www.tmall.com ceo:

RobinLi: 李彦宏

PonyMa: 马化腾

JackMa: 马云

注:格式如下

对象 :

  1. 对象:
  2. 对象:键值
  3. 数组:
  4. - 数组成员
  5. - 数组成员
  1. 纯量

纯量是最基本的、不可再分的值。如:字符串、布尔值、整数、浮点数、Null、时间、日期

例:数值直接以字面量的形式表示。

number: 11.30

11.4 kubectl create加载yaml文件生成deployment

使用kubectl run在设定很复杂的需求时,需要非常长的一条语句,也很容易出错,也没法保存。所以更多场景下会使用yaml或者json文件。

11.4.1 生成mysql-deployment.yaml 文件:

上传mysql服务器镜像docker.io-mysql-mysql-server.tar 到node1和node2上

5-使用kubectl管理Kubernetes容器平台-笔记-v12 - 图7

上传mysql-deployment.yaml到xuegod63管理结点

5-使用kubectl管理Kubernetes容器平台-笔记-v12 - 图8

[root@xuegod62 ~]# scp docker.io-mysql-mysql-server.tar 192.168.1.64:/root/ [root@xuegod62 ~]# docker load -i docker.io-mysql-mysql-server.tar [root@xuegod64 ~]# docker load -i docker.io-mysql-mysql-server.tar 查看刚上传的mysql-deployment.yaml的内容 [root@xuegod63 ~]# vim mysql-deployment.yaml #查看内容 kind: Deployment #使用deployment创建一个pod资源,旧的k8s版本可以使用kind: ReplicationController 来创建pod apiVersion: apps/v1 metadata: name: mysql #deployment的名称,全局唯一 namespace: default labels: k8s-app: mysql spec: selector: matchLabels: k8s-app: mysql replicas: 1 # Pod副本期待数量,1表示只运行一个pod,里面一个容器 template: metadata: labels: k8s-app: mysql spec: containers: # Pod中容器的定义部分 - name: mysql #容器的名称 image: mysql/mysql-server #容器对应的Docker Image镜像 imagePullPolicy: IfNotPresent #默认值为:imagePullPolicy: Always一直从外网,下载镜像,不用使用本地的。 #其他镜像下载策略参数说明: #IfNotPresent :如果本地存在镜像就优先使用本地镜像。这样可以直接使用本地镜像,加快启动速度。Present [ˈpreznt] 目前;现在 #Never:直接使用本地镜像,不再去外网拉取镜像;如果本地不存在就报异常了。 ports: - containerPort: 3306 #容器暴露的端口号 protocol: TCP env: #注入到容器的环境变量 - name: MYSQL_ROOT_PASSWORD #设置mysql root的密码 value: “hello123” 注: mysql-deployment.yaml 文件结构:

5-使用kubectl管理Kubernetes容器平台-笔记-v12 - 图9

11.4.2 使用mysql-deployment.yaml创建和删除mysql资源

[root@xuegod63 yamls]# kubectl create -f mysql-deployment.yaml

deployment “mysql” created

注:当一个目录下,有多个yaml文件的时候,使用kubectl create -f 目录 的方式一下全部创建

[root@xuegod63 tmp]# kubectl create -f yamls/

deployment “mysql” created

deployment “ mysql 1” created

扩展:

使用kubectl create 和 kubectl apply创建资源对象的区别

kubectl apply -f FILENAME 可多次执行,每次修改YAML文件后,使用apply可直接部署

kubectl create -f FILENAME 不可多次执行,每次修改YAML后,需要先删除资源后才能部署

推荐使用apply部署资源对象,delete删除资源对象。

11.4.3 使用get参数查看pod详细信息:

[root@xuegod63 ~]# kubectl get pod

NAME READY STATUS RESTARTS AGE

mysql-77596d4dcb-wrgmt 1/1 Running 0 55s

[root@xuegod63 ~]# kubectl get deployment

NAME READY UP-TO-DATE AVAILABLE AGE

mysql 1/1 1 1 44s

加上-o wide参数可以查看更详细的信息,比如看到此pod在哪个node上运行,此pod的集群IP是多少也被一并显示了

[root@xuegod63 ~]# kubectl get pod -o wide

5-使用kubectl管理Kubernetes容器平台-笔记-v12 - 图10

注:10.122.78.73这个是pod的IP

测试:

[root@xuegod63 ~]# ping 10.122.78.73 #可以ping通

[root@xuegod63 ~]# ip addr show tunl0

。。。

  1. inet <font style="color:#FF0000;">10.122.78.64</font>/32 brd 10.122.78.64 scope global tunl0

ping node1 上的tunl0的地址,也可以通的

总结: master,node1,pod,docker,container 它们之间通信都是使用etcd分配的地址。也就是通过tunl0隧道把物理上分开的主机和容器,连接在一个局域网中了。

回顾:使用kubeadm初始化k8s集群

[root@xuegod63 ~]# kubeadm init —kubernetes-version=1.18.2 \

—apiserver-advertise-address=192.168.1.63 \

—image-repository registry.aliyuncs.com/google_containers \

—service-cidr=10.10.0.0/16 —pod-network-cidr=10.122.0.0/16

注:—kubernetes-version # 指定要安装的k8s版本

—pod-network-cidr # 指定pod网络地址范围 —service-cidr # 指定service网络地址范围 —apiserver-advertise-address #指定api地址,这里配置成了master的私网接口IP

在node1查看运行mysql docker实例:

[root@xuegod62 ~]# docker ps | grep mysql

总结:get命令能够确认的信息类别:

deployments (缩写 deploy)

events (缩写 ev)

namespaces (缩写 ns)

nodes (缩写 no)

pods (缩写 po)

replicasets (缩写 rs)

replicationcontrollers (缩写 rc)

services (缩写 svc)

11.4.4 使用describe查看k8s中详细信息

describe [dɪˈskraɪb] 描述

语法: kubectl describe pod pod名字 语法: kubectl describe node node名字 语法: kubectl describe deployment deployment 名字 1. 使用describe查看pod的详细描述信息 [root@xuegod63 ~]# kubectl describe pod mysql-77596d4dcb-wrgmt 通过这个可以查看创建pod时报的错误信息,可以看到以下错误:

5-使用kubectl管理Kubernetes容器平台-笔记-v12 - 图11

注:在下载镜像时,因为从外网下载,可能会报错。 所以我们可以提前把镜像上传到所有node节点上。 2. 使用describe查看node的详细描述信息 [root@xuegod63 ~]# kubectl describe node xuegod62.cn #查看详细信息 3. 使用describe查看deployment的详细描述信息 [root@xuegod63 ~]# kubectl describe deployment mysql

11.5 kubectl其他常用命令和参数说明

命令 说明

logs 取得pod中容器的log信息

exec 在pod中执行一条命令、登录到pod

cp 从pod拷出或向pod拷入文件

attach Attach附加到一个运行中的pod上,实时查看pod消息

实验环境:先生成一个mysql资源:

[root@xuegod63 yamls]# kubectl apply -f /root /mysql-deployment.yaml

这个命令在之前已经生成了。这里就不用执行了。

11.5.1 kubectl logs

类似于docker logs,使用kubectl logs能够取出pod中镜像的log,也是故障排除时候的重要信息

[root@xuegod63 ~]# kubectl get pod

[root@xuegod63 yamls]# kubectl logs mysql-77596d4dcb-wrgmt

[Entrypoint] MySQL Docker Image 5.7.20-1.1.2

[Entrypoint] Initializing database

[Entrypoint] Database initialized

Warning: Unable to load ‘/usr/share/zoneinfo/iso3166.tab’ as time zone. Skipping it.

。。。

查看pod里指定容器的日志

[root@xuegod63 ~]# kubectl logs mysql-76f8866f79-98fw4 -c mysql

11.5.2 kubectl exec

exec命令用于到pod中执行一条命令,到mysql的镜像中执行cat /etc/my.cnf命令

[root@xuegod63 ~]# kubectl get pod

[root@xuegod63 ~]# kubectl exec mysql-77596d4dcb-wrgmt cat /etc/my.cnf

例2:使用参数exec -it ,直接登pod上中

[root@xuegod63 ~]# kubectl exec -it mysql-77596d4dcb-wrgmt bash

bash-4.2# exit

11.5.3 kubectl cp

用于从pod中拷出hosts文件到物理机的/tmp下

[root@xuegod63 ~]# kubectl cp mysql-77596d4dcb-wrgmt:/etc/hosts /tmp/hosts

command terminated with exit code 126 #报错

排错方法

[root@xuegod63 ~]# kubectl cp —help

Copy files and directories to and from containers.

Examples:

!!!Important Note!!!

Requires that the ‘tar’ binary is present in your container #发现想要使用kubectl cp你的容器实例中必须有tar库

# image. If ‘tar’ is not present, ‘kubectl cp’ will fail. #如果镜像中tar命令不存在,那么kubectl cp将失败 安装mysql pod中安装tar命令: [root@xuegod63 ~]# kubectl exec -it mysql-77596d4dcb-wrgmt bash 创建阿里yum源,默认此镜像中带的是oracle的源,如果不能使用,就自己创建。 bash-4.2# mv /etc/yum.repos.d/public-yum-ol7.repo /opt/ bash-4.2# cat > /etc/yum.repos.d/CentOS-Base.repo < /tmp/message.log bash-4.2# exit 拷贝出来并确认

[root@xuegod63 ~]# kubectl cp mysql-77596d4dcb-wrgmt:/tmp/message.log message.log

tar: Removing leading `/‘ from member names

[root@xuegod63 ~]# cat message.log

this is a message from mysql-77596d4dcb-wrgmt

更改message.log并拷贝回pod

[root@xuegod63 ~]# echo “ I am mk!!!” >>message.log

[root@xuegod63 ~]# kubectl cp message.log mysql-77596d4dcb-wrgmt:/tmp/message.log

确认更改后的信息

[root@xuegod63 ~]# kubectl exec mysql-77596d4dcb-wrgmt cat /tmp/message.log

this is a message from mysql-77596d4dcb-wrgmt

I am mk!!!

11.5.4 kubectl attach

kubectl attach用于取得pod中容器的实时信息,可以持续不断实时的取出消息。像tail -f /var/log/messages 动态查看日志的作用。

kubectl logs是一次取出所有消息,像cat /etc/passwd

attach [əˈtætʃ] 贴上 附上

[root@xuegod63 ~]# kubectl attach mysql-77596d4dcb-wrgmt

注: 到现在,所创建nginx和mysql都只是deployment设备硬件资源,并没有对应service服务,所以现在还不能直接在外网进行访问nginx和mysql服务。

11.6 kubectl维护k8s集群相关命令

实战环境:k8s集群中,发生了以下情况:有一个pod坏了,pod要镜像要升级,pod中nginx服务器的配置文件要修改,pod镜像要替换,要多起一个pod,node物理机要升级内存,不想在这个node物理机上运行新的pod等情况。怎么操作?

kubectl相关命令参数如下:

kubectl edit 编辑服务器侧资源

kubectl replace 替换,使用yaml配置文件来替换正在运行中的配置参数

kubectl patch 部分更新资源相关信息

kubectl apply 使用文件或者标准输入更改配置信息

kubectl scale 重新设定Deployment/ReplicaSet/RC/Job的size

kubectl autoscale Deployment/ReplicaSet/RC的自动扩展设定

kubectl cordon 设定node不可使用

kubectl uncordon 设定node可以使用

kubectl drain 设定node进入维护模式

11.6.1 创建资源文件

生成nginx-deployment.yaml资源和nginx-svc.yaml服务的配置文件

上传docker.io-nginx-php-fpm.tar并导入所有node:

先上传到xuegod62上,再复制给xuegod64:

[root@xuegod62 ~]# scp docker.io-nginx-php-fpm.tar 192.168.1.64:/root

[root@xuegod62 ~]# docker load -i docker.io-nginx-php-fpm.tar

[root@xuegod64 ~]# docker load -i docker.io-nginx-php-fpm.tar

上传nginx-deployment.yaml资源和nginx-svc.yaml 到xuegod63上。

5-使用kubectl管理Kubernetes容器平台-笔记-v12 - 图12

使用Deployment方式启动nginx的pod和service [root@xuegod63 ~]# vim /root/nginx-deployment.yaml #查看配置文件 kind: Deployment apiVersion: apps/v1 metadata: name: nginx namespace: default labels: k8s-app: nginx spec: selector: matchLabels: k8s-app: nginx replicas: 2 #创建两个pod template: metadata: labels: k8s-app: nginx spec: containers: - name: nginx image: nginx:latest imagePullPolicy: IfNotPresent ports: - containerPort: 80 protocol: TCP [root@xuegod63 ~]# vim /root/nginx-svc.yaml #查看service 文件 kind: Service apiVersion: v1 metadata: name: nginx labels: k8s-app: nginx spec: type: NodePort ports: - protocol: TCP nodePort: 31001 targetPort: 80 port: 3000 selector: k8s-app: nginx 注: nodePort: 31001 #指定是node物理机上监控听的端口,后期公网上的机器,可以访问此端口。 targetPort: 80 #nginx pod的端口号,也就是真正docker监听的端口号 port: 3000 #service 服务端口号 service 集群IP监听的端口,K8S内部各个service服务,使用这个端口号进行通信

11.6.2 查看并创建deployment和serveice

[root@xuegod63 ~]# kubectl get service #查看service

kubernetes ClusterIP 10.10.0.1 443/TCP 67d

nginx LoadBalancer 10.10.112.224 3000:32034/TCP 21h [root@xuegod63 ~]# kubectl delete service nginx #删除service service “nginx” deleted [root@xuegod63 ~]# kubectl get service 开始创建: [root@xuegod63 ~]# kubectl create -f nginx-deployment.yaml
[root@xuegod63 ~]# kubectl create -f nginx-svc.yaml 查看创建的: pod、deployment、service [root@xuegod63 ~]# kubectl get pod -o wide #查看详细信息 5-使用kubectl管理Kubernetes容器平台-笔记-v12 - 图13 [root@xuegod63 ~]# kubectl get deploy NAME READY UP-TO-DATE AVAILABLE AGE mysql 1/1 1 1 54m nginx 2/2 2 2 56s [root@xuegod63 ~]# kubectl get service 或: [root@xuegod63 ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.10.0.1 443/TCP 67d nginx NodePort 10.10.233.171 3000:31001/TCP 16s 注:发现service 3000端口已经映射到node物理机节点的31001端口上了 5-使用kubectl管理Kubernetes容器平台-笔记-v12 - 图14 。可以查看到nginx服务已经运行在node1上。 http://192.168.1.62:31001/http://192.168.1.64:31001/ 都可以访问的。 5-使用kubectl管理Kubernetes容器平台-笔记-v12 - 图15 尽管ngixn的pod是在node1运行的,但我们去访问任意node,都可以正常访问nginx的。已经做了负载均衡。 修改一下默认主页: 方法1:连接到nginx pod中: [root@xuegod63 ~]# kubectl exec -it nginx-6698f44dcc-k9sk9 bash root@nginx-6698f44dcc-k9sk9:/# cd /usr/share/nginx/html/ root@nginx-6698f44dcc-k9sk9:/usr/share/nginx/html# echo xuegod.cn > index.html

访问:http://192.168.1.62:31001/

5-使用kubectl管理Kubernetes容器平台-笔记-v12 - 图16

方法2:

[root@xuegod63 ~]# echo xuegod63.xuegod.cn > index.html

[root@xuegod63 ~]# kubectl cp index.html nginx-6698f44dcc-k9sk9:/usr/share/nginx/html/index.html

访问: http://192.168.1.62:31001/

5-使用kubectl管理Kubernetes容器平台-笔记-v12 - 图17

以下维护k8s的命令,大家自己操作一下或了解一下就可以了

11.6.3 kubectl edit修改服务配置

1、kubectl get -o 格式化输出,-o 指定输出的消息为yaml类型

例1:以yaml类型查看nginx的service信息

[root@xuegod63 ~]# kubectl get service nginx -o yaml

2、edit这条命令用于编辑服务器上的资源。

例1:改端口3100131002

[root@xuegod63 ~]# kubectl edit service nginx

改: 46 - nodePort: 31001 为: 46 - nodePort: 31002 编辑之后确认结果发现,此服务端口已经改变 [root@xuegod63 ~]# kubectl get service NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 172.200.0.1 443/TCP 1d nginx 172.200.229.212 80:31002/TCP 8m 修改后,发现nginx可以正常访问,而之前的端口已经不通 http://192.168.1.62:31002/ 5-使用kubectl管理Kubernetes容器平台-笔记-v12 - 图18 注:edit编辑修改配置文件时,不需要停止服务。改完后立即生效

11.6.4 kubectl replace

replace就是替换,把nodeport端口改为31003

[root@xuegod63 ~]# kubectl get service nginx -o yaml > nginx_replace.yaml

[root@xuegod63 ~]# vim nginx_replace.yaml

改: 42 - nodePort: 31002

为: 42 - nodePort: 31003

注:不能直接改成31001

不然后:报错:

[root@xuegod63 ~]# kubectl replace -f nginx_replace.yaml The Service “nginx” is invalid: spec.ports[0].nodePort: Invalid value: 31001: provided port is already allocated

执行replace命令

[root@xuegod63 ~]# kubectl replace -f nginx_replace.yaml

service “nginx” replaced

确认结果,确认之后发现port确实重新变成了31003

[root@xuegod63 ~]# kubectl get service

NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE

kubernetes 172.200.0.1 443/TCP 1d

nginx 11.254.64.119 80:31003/TCP 33m

11.6.5 kubectl patch

当修改一部分设定时,使用patch很方便。比如:给pod换个image镜像。

patch [pætʃ] 补丁

查看当前port中使用的nginx镜像是否能解析php:

[root@xuegod63 ~]# kubectl exec -it nginx-6698f44dcc-k9sk9 bash

root@nginx-6698f44dcc-k9sk9:/# nginx -v

nginx version: nginx/1. 13.8

root@nginx-6698f44dcc-k9sk9:/# php #发现不支持php

bash: php: command not found

执行patch进行替换,替换成可以支持php的nginx docker镜像 上传docker.io-nginx-php-fpm.tar镜像到所有node上并导入。先传到node1上

5-使用kubectl管理Kubernetes容器平台-笔记-v12 - 图19

[root@xuegod62 ~]# scp docker.io-nginx-php-fpm.tar 192.168.1.64:/root/ [root@xuegod62 ~]# docker load -i docker.io-nginx-php-fpm.tar [root@xuegod64 ~]# docker load -i docker.io-nginx-php-fpm.tar 开始替换镜像:

[root@xuegod63 ~]# kubectl patch pod nginx-6698f44dcc-k9sk9 -p ‘{“spec”:{“containers”:[{“name”:”nginx”,”image”:”richarvey/nginx-php-fpm:latest”}]}}’

“nginx-6698f44dcc-k9sk9” patched

排错经验:”image”:”richarvey/nginx-php-fpm:latest” 镜像名和双引号之间不能用空格,否则会显示:

[root@xuegod63 ~]# kubectl get pod

NAME READY STATUS RESTARTS AGE

nginx-6698f44dcc-k9sk9 0/1 InvalidImageName 1 1d

查看结果

[root@xuegod63 ~]# kubectl exec nginx-6698f44dcc-k9sk9 -it bash

bash-4.3# php -v

PHP 7.1.12 (cli) (built: Dec 1 2017 19:26:10) ( NTS )

测试访问:http://192.168.1.62:31003/index.php

5-使用kubectl管理Kubernetes容器平台-笔记-v12 - 图20

11.6.6 kubectl apply

apply命令是用来使用文件或者标准输入来更改配置信息。

[root@xuegod63 ~]# vim nginx-svc.yaml

改:11 nodePort: 31001

为:11 nodePort: 31004

执行apply命令,执行设定文件可以在运行状态修改port信息

[root@xuegod63 ~]# kubectl apply -f nginx-svc.yaml

Warning: kubectl apply should be used on resource created by either kubectl create —save-config or kubectl apply

service/nginx configured

注:警告:kubectl apply应用于由kubectl create—save config或kubectl apply创建的资源

[root@xuegod63 ~]# kubectl get svc

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

kubernetes ClusterIP 10.10.0.1 443/TCP 67d

nginx NodePort 10.10.233.171 3000:31004/TCP 21m

已经改变。

11.6.7 kubectl scale

scale [skeɪl] 规模

scale命令用于横向扩展,是kubernetes或者swarm这类容器编辑平台的重要功能之一 实现环境: 之前已经设定nginx的replica副本为2。 查看nginx现在在哪个结点上运行: [root@xuegod63 ~]# kubectl get pod -o wide 执行scale命令,使用scale命令进行横向扩展,将原本为2的副本提高到3。相当于开3台nginx服务,来处理数据,瞬间提升了处理数据的能力。 [root@xuegod63 ~]# kubectl scale —current-replicas=2 —replicas=3 deployment/nginx deployment.apps/nginx scaled [root@xuegod63 ~]# kubectl get deploy NAME READY UP-TO-DATE AVAILABLE AGE mysql 1/1 1 1 86m nginx 3/3 3 3 23m [root@xuegod63 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE mysql-77596d4dcb-wrgmt 1/1 Running 0 86m nginx-6698f44dcc-78kvb 1/1 Running 0 9s nginx-6698f44dcc-k9sk9 1/1 Running 1 23m nginx-6698f44dcc-wztbs 1/1 Running 0 9s [root@xuegod63 ~]# kubectl get pod -o wide # 查看pod都在哪些物理机上运行

5-使用kubectl管理Kubernetes容器平台-笔记-v12 - 图21

访问:http://192.168.1.64:31004/http://192.168.1.62:31004/ 都可以访问。

11.6.8 kubectl autoscale

autoscale命令用于自动扩展确认,scale需要手动执行,而autoscale则会根据负载进行调解。而这条命令则可以对Deployment进行设定,通过最小值和最大值的指定进行设定。

[root@xuegod63 ~]# kubectl autoscale deployment nginx —min=2 —max=5

horizontalpodautoscaler.autoscaling/nginx autoscaled

当然使用还会有一些限制,比如当前3个,设定最小和最大值为2的,会报以一下错误:

[root@xuegod63 ~]# kubectl autoscale deployment nginx —min=2 —max=2

Error from server (AlreadyExists): horizontalpodautoscalers.autoscaling “nginx” already exists

11.6.9 kubectl cordon 与 uncordon

cordon [ˈkɔ:dn] 封锁 警戒线

在实际维护的时候会出现某个node坏掉,或者做一些处理,暂时不能让生成的pod在此node上运行,需要通知kubernetes让其不要创建过来,这条命令就是cordon,uncordon则是取消这个要求。 之前横向扩展到3个副本,发现利用roundrobin策略,每个node上运行起来了一个pod,是平均分配的。 执行cordon命令 设定node2上不再运行新的pod实例,使用get node确认,其状态显示SchedulingDisabled。 [root@xuegod63 ~]# kubectl cordon xuegod64.cn node/xuegod64.cn cordoned [root@xuegod63 ~]# kubectl get nodes -o wide

5-使用kubectl管理Kubernetes容器平台-笔记-v12 - 图22

执行scale命令,再次执行横向扩展命令,看是否会有pod漂到node2这台机器上,结果发现只有之前的一个pod,再没有新的pod漂过去。 [root@xuegod63 ~]# kubectl scale —replicas=6 deployment/nginx deployment.apps/nginx scaled [root@xuegod63 ~]# kubectl get pod -o wide 注:发现新扩展的pod都在node1运行了,没有在node2上运行,说明封锁node2成功了。另外,我们指定扩展到6个pod,但是只运行了5个,因为前面执行autoscale时,指定最多可以扩展到5个。如下图:

5-使用kubectl管理Kubernetes容器平台-笔记-v12 - 图23

2、执行uncordon解除封锁命令 使用uncordon命令解除对node2机器的限制,通过get node确认状态也已经正常。 [root@xuegod63 ~]# kubectl uncordon xuegod64.cn node/xuegod64.cn uncordoned [root@xuegod63 ~]# kubectl get nodes -o wide NAME STATUS AGE EXTERNAL-IP node1 Ready 56d node2 Ready 56d [root@xuegod63 ~]# 执行scale命令 再次执行scale命令,发现有新的pod可以创建到134node上了。 [root@xuegod63 ~]# kubectl scale —replicas=7 deployment nginx deployment.apps/nginx scaled

11.6.10 kubectl drain

kubectl drain命令 [dreɪn] 排水

用于对某个node结点进行维护。

drain两个作用:

  1. 设定此node不可以使用(cordon)

  2. evict驱逐pod到他正常的node节点上

evict [ɪˈvɪkt] 驱逐

事前准备,删除没有用的deploy,节约点硬件资源

[root@xuegod63 ~]# kubectl delete deployment nginx #删除之前的nginx部署

[root@xuegod63 ~]# kubectl delete deployment mysql #删除之前的mysql部署

例:将nginx的副本由2个设定为4,发现node1和node2各启动了两个pod。

[root@xuegod63 ~]# kubectl create -f /root/nginx-deployment.yaml

[root@xuegod63 ~]# kubectl scale —replicas=4 deployment nginx

deployment “nginx” scaled

[root@xuegod63 ~]# kubectl get pod -o wide

5-使用kubectl管理Kubernetes容器平台-笔记-v12 - 图24

执行drain命令,让node1不可用,并把node1上已经运行pod驱逐到其他node上:

[root@xuegod63 ~]# kubectl drain xuegod62.cn —ignore-daemonsets

注:—ignore-daemonsets —忽略守护进程

node/xuegod62.cn already cordoned

WARNING: ignoring DaemonSet-managed Pods: kube-system/calico-node-gv8rz, kube-system/kube-proxy-l77c8

evicting pod default/nginx-6698f44dcc-nc8dl

evicting pod default/nginx-6698f44dcc-vs7rc

pod/nginx-6698f44dcc-vs7rc evicted

pod/nginx-6698f44dcc-nc8dl evicted

node/xuegod62.cn evicted

结果确认

把node2上的pod删除后,k8s会根据replicas的机制,在清退pod和设定node时,在其他结点上生成新的pod。这时就可以对node2节点进行维护了,维护好后,重新uncordon即可。

[root@xuegod63 ~]# kubectl get pod -o wide

5-使用kubectl管理Kubernetes容器平台-笔记-v12 - 图25

[root@xuegod63 ~]# kubectl get nodes -o wide

5-使用kubectl管理Kubernetes容器平台-笔记-v12 - 图26

等修复好结点后,现在恢复可用:

[root@xuegod63 ~]# kubectl uncordon xuegod62.cn

总结:

11.1 kubectl概述

11.2 kubectl创建和删除一个pod相关操作

11.3 yaml语法规则

11.4 kubectl create加载yaml文件生成deployment设备资源

11.5 kubectl其他常用命令和参数说明

11.6 使用kubectl管理集群中deployment资源和service服务