Kubernetes(K8s)(三)——kubectl命令
k8s中文社区文档:http://docs.kubernetes.org.cn/
k8s中文社区YAML:https://www.kubernetes.org.cn/1414.html
(1).kubectl概述
kubectl是Kubernetes集群的命令行工具,通过kubectl能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。
(2).语法说明
语法:kubectl [操作命令] [资源类型] [资源名称] [可选参数]
操作命令:指对一个或多个资源执行的操作。
资源类型:资源类型不区分大小写,可指定单数、复数或缩写形式。
资源名称:资源名称区分大小写,如果省略则显示所有资源的详细信息。
在指定多个资源执行操作时,可以按资源类型和资源名称指定每个资源,或指定一个或多个模板文件。在按资源类型和资源名称指定资源时,可以对同一资源类型的资源进行分类(例如:kubectl get pod example-pod1 example-pod2),也可以分别指定多个资源类型。在指定一个或多个模板文件时,使用yaml格式而不是json格式,因为yaml格式更易于使用,特别是配置文件。
可选参数:指定的可选参数会覆盖默认值和相应的环境变量。
完整内容请看:https://kubernetes.io/zh/docs/reference/kubectl/overview/
(3).yaml语法规则
YAML特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲(例如:许多电子邮件标题格式和YAML非常接近),YAML 的配置文件后缀为.yml,例如:example.yml。
1)yaml配置文件常见单词
kind:类型;apiVersion:API版本;metadata:元数据;spec:规格,说明书(定义具体参数);replicas:副本;selector:选择器;template:模板;
2)基本语法规则
1、大小写敏感(区分大小写);
2、使用缩进表示层级;
3、缩进时不允许使用<Tab>键,只能使用空格;
4、缩进空格数目不重要,只要相同层级的元素左对齐即可;
5、#表示注释;
6、在yaml里,连续的项目(如:数组元素、集合元素)通过减号"-"来表示,map结构里的键值对(key/value)用冒号":"来分隔。
3)数据结构
YAML支持三种数据结构:对象、数组、纯量。
对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
纯量(scalars):单个的、不可再分的值
4)对象
对象的键值对使用冒号结构表示[key]: [value],冒号后存在一个空格。例如:
key: value
也可以将所有键值对写成行内对象,例如:
key: {child-key1: value1,child-key2: value2} 或 key: child-key1: value1 child-key2: value2
较为复杂的对象格式,可以用问号加空格表示一个复杂的key开始,用冒号加空格表示一个复杂的value开始。例如:
? - complexkey1 - complexkey2 : - complexvalue1 - complexvalue2
该对象的属性是一个数组,该对象的值也是一个数组。
5)数组
一组以减号(连词线)"-"开头的行构成一个数组。例如:
- A - B - C
支持多维数组,可以使用行内表示:
key: [value1,value2,value3...]
如果不想有key,那么就如下:
- - A - B - C
最后举一个对象与数组的复杂例子,如下:
OS: - id: 1 name: CentOS version: 7.5 - id: 2 name: Windows version: 7 也可以写成流式,如下: OS: [{id: 1,name: CentOS,version: 7.5},{id: 2,name: Windows,version: 7}]
6)复合结构
符合结构就是对象和数组的混合使用,数组中也有一个例子。这里再写一个例子,并与json格式进行对比
YAML格式:
languages: - Ruby - Perl - Python websites: YAML: yaml.org Ruby: ruby-lang.org Python: python.org Perl: use.perl.org
JSON格式:
{ languages: [ 'Ruby', 'Perl', 'Python'], websites: { YAML: 'yaml.org', Ruby: 'ruby-lang.org', Python: 'python.org', Perl: 'use.perl.org' } }
7)纯量
纯量是指最基本的,不可再分的值。包括:字符串、布尔值、整数、浮点数、Null、时间和日期。
一个例子直接带过,如下:
boolean: - TRUE #true,True都可以 - FALSE #false,False都可以 float: - 3.14 - 6.8523015e+5 #可以使用科学计数法 int: - 123 - 0b1010_0111_0100_1010_1110 #二进制表示 null: nodeName: 'node' parent: ~ #使用~表示null string: - 哈哈 - 'Hello world' #可以使用双引号或者单引号包裹字符串 - newline newline2 #字符串可以拆成多行,换行符会被转化成一个空格 date: - 2018-02-17 #日期必须使用ISO 8601格式,即yyyy-MM-dd datetime: - 2018-02-17T15:02:31+08:00 #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
8)引用
"& [别名]"建立引用内容,并设置别名;"<<"合并到当前数据;": [别名]"通过别名引用内容。
举一个较为复杂的例子:
defaults: &defaults adapter: postgres host: localhost development: database: myapp_development <<: *defaults test: database: myapp_test <<: *defaults
完全展开,相当于:
defaults: adapter: postgres host: localhost development: database: myapp_development adapter: postgres host: localhost test: database: myapp_test adapter: postgres host: localhost
觉得不好理解的,可以转换为流式进行理解。比如说:
defaults: adapter: postgres host: localhost 等同于: defaults: {adapter: postgres,host: localhost} 那么 defaults: &defaults adapter: postgres host: localhost 就等同于: defaults: &defaults {adapter: postgres,host: localhost}
是不是更好理解一点呢。
(4).常用命令
首先需要在两台node节点上配置docker加速器,然后下载一个centos镜像和一个k8s基础镜像(也可以从本地导入镜像)。说明:docker.io是指由Ubuntu维护的镜像。
# tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://8mkqrctt.mirror.aliyuncs.com"] } EOF # systemctl daemon-reload && systemctl restart docker # docker search nginx INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED docker.io docker.io/nginx Official build of Nginx. 12501 [OK] docker.io docker.io/jwilder/nginx-proxy Automated Nginx reverse proxy for docker c... 1721 [OK] docker.io docker.io/richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable ... 753 [OK] ...... # docker pull docker.io/nginx #下载演示用镜像 Using default tag: latest Trying to pull repository docker.io/library/nginx ... latest: Pulling from docker.io/library/nginx 8ec398bc0356: Pull complete dfb2a46f8c2c: Pull complete b65031b6a2a5: Pull complete Digest: sha256:8aa7f6a9585d908a63e5e418dc5d14ae7467d2e36e1ab4f0d8f9d059a3d071ce Status: Downloaded newer image for docker.io/nginx:latest # docker search registry.access.redhat.com/rhel7/pod-infrastructure #k8s基础镜像,可以提前下载。也可让k8s自动下载 INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED redhat.com registry.access.redhat.com/rhel7/pod-infrastructure OpenShift Container Platform Infrastructur... 0 # docker pull registry.access.redhat.com/rhel7/pod-infrastructure
注意:如果没有提前下载registry.access.redhat.com/rhel7/pod-infrastructure这个k8s的基础镜像,那么在创建容器副本时会优先下载该镜像,并且查看pods状态时会一直处在ContainerCreating(容器创建中),此时只需等待k8s下载完该镜像即可。
1)kubectl run运行镜像实例
kubectl run NAME --image=image [--env="key=value"] [--port=port] [--replicas=replicas] [--dry-run=bool] [--overrides=inline-json] [flags]
说明:--replicas是为此容器创建的副本数量。
在master上使用kubectl创建镜像实例,在创建过程中会自动生成deployment和pod来管理容器。说明:deployment(Deployment controller,部署控制器)为Pods和ReplicaSets(副本集合)提供声明性更新,即在部署对象中描述所需的状态,部署控制器将会在可控范围内将实际状态变更为所需状态。通过部署控制器可以创建新的副本,或删除现有副本,或回收资源重新创建新的副本。
[root@kube-master ~]# kubectl run nginx --image=docker.io/nginx --port=9000 --replicas=1 deployment "nginx" created [root@kube-master ~]# kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx 1 1 1 1 5s [root@kube-master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-2187705812-qhrr1 1/1 Running 0 16s
pods的状态一般有四种:1、ContainerCreating,容器创建中;2、ImagePullBackOff,从后端(docker镜像站)把镜像拉取到本地时断开,建议本地镜像或阿里云加速器;3、Running,正在运行中;4、Terminating,终止,删除pod时的状态。
如果一直处在ContainerCreating或Terminating时,请检查所有node节点是否存在registry.access.redhat.com/rhel7/pod-infrastructure这个k8s基础镜像,没有也不用担心,等待k8s下载,就是时间会比较长。
创建完成后可以到node节点上使用docker命令查看一下,可以发现只启动了一个nginx镜像实例
#node1节点上没有启动实例 [root@kube-node1 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES #node2节点上启动了 [root@kube-node2 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 385b564f1765 docker.io/nginx "nginx -g 'daemon ..." 38 minutes ago Up 38 minutes k8s_nginx.92d20176_nginx-2187705812-qhrr1_default_06a3ebf9-3a64-11ea-af25-000c29d2651b_b37ddfc8 ff7ef18731c5 registry.access.redhat.com/rhel7/pod-infrastructure:latest "/usr/bin/pod" 38 minutes ago Up 38 minutes k8s_POD.17af0ba2_nginx-2187705812-qhrr1_default_06a3ebf9-3a64-11ea-af25-000c29d2651b_95f2d0df
2020.2.17补充:namespce、deployment、replicaset、pod四者之间的关系。看几个获取信息,应该就很好理解了。
#第一个,获取四者存在的名称 [root@kube-master ~]# kubectl get namespace NAME STATUS AGE default Active 33d kube-system Active 33d [root@kube-master ~]# kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx 1 1 1 1 27d [root@kube-master ~]# kubectl get replicaset NAME DESIRED CURRENT READY AGE nginx-2187705812 1 1 1 27d [root@kube-master ~]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-2187705812-cbb2s 1/1 Running 1 27d #第二个,获取四者的详细信息 [root@kube-master ~]# kubectl describe pod nginx-2187705812-cbb2s Name: nginx-2187705812-cbb2s #pod的名称 Namespace: default #所属命名空间 Node: kube-node2/192.168.128.112 Start Time: Mon, 20 Jan 2020 13:14:29 +0800 Labels: pod-template-hash=2187705812 run=nginx Status: Running IP: 10.255.21.2 Controllers: ReplicaSet/nginx-2187705812 #所属的副本控制器(新版本中的名称,RC变为RS) Containers: nginx: Container ID: docker://4a15ef334ee88704a182982ea5d7b241b0b76f5a5df293660828696c3c71eb75 Image: docker.io/nginx Image ID: docker-pullable://docker.io/nginx@sha256:ad5552c786f128e389a0263104ae39f3d3c7895579d45ae716f528185b36bc6f Port: 9000/TCP State: Running Started: Mon, 17 Feb 2020 09:50:44 +0800 Ready: True Restart Count: 1 Volume Mounts: <none> Environment Variables: <none> Conditions: Type Status Initialized True Ready True PodScheduled True No volumes. QoS Class: BestEffort Tolerations: <none> No events. [root@kube-master ~]# kubectl describe replicaset nginx-2187705812 Name: nginx-2187705812 #副本控制器的名称 Namespace: default #所属命名空间 Image(s): docker.io/nginx Selector: pod-template-hash=2187705812,run=nginx Labels: pod-template-hash=2187705812 run=nginx Replicas: 1 current / 1 desired Pods Status: 1 Running / 0 Waiting / 0 Succeeded / 0 Failed No volumes. No events. [root@kube-master ~]# kubectl describe deployment nginx Name: nginx #deployment的名称 Namespace: default #所属的命名空间 CreationTimestamp: Mon, 20 Jan 2020 13:14:29 +0800 Labels: run=nginx Selector: run=nginx Replicas: 1 updated | 1 total | 1 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 1 max unavailable, 1 max surge Conditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable OldReplicaSets: <none> NewReplicaSet: nginx-2187705812 (1/1 replicas created) #副本控制器 No events. [root@kube-master ~]# kubectl describe namespace default Name: default #命名空间名称 Labels: <none> Status: Active No resource quota. No resource limits.
可以看到默认pod的名称是在replicaset名称的基础上创建,而replicaset名称又是在deployment名称基础上创建。
2)kubectl delete删除镜像实例
理论上来说,pod作为可以被操作的最小单元,删除镜像实例时应该删除pod。但是在实际操作过程中,想要删除镜像实例应该对deployment(部署控制器)镜像进行删除。因为deployment(部署控制器)其中一个功能就是声明副本数量和状态,当deployment内的pod被删除时,为了确保副本数量和状态不变,会自动生成行的副本。
演示如下:
#首先尝试删除pod [root@kube-master ~]# kubectl delete pod nginx-2187705812-qhrr1 pod "nginx-2187705812-qhrr1" deleted #立即查看pod,可以看到pod名称发生了变化,但还是存在的 [root@kube-master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-2187705812-llnn1 0/1 ContainerCreating 0 6s #稍等一会儿,可以看下node节点上的docker实例 #node2节点上的镜像实例已经没有了 [root@kube-node2 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES #在node1节点上生成了新的镜像实例 [root@kube-node1 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5dab3629cd31 docker.io/nginx "nginx -g 'daemon ..." 29 seconds ago Up 28 seconds k8s_nginx.92d20176_nginx-2187705812-llnn1_default_bca68cc3-3a6b-11ea-af25-000c29d2651b_7ea84e24 bd8804d961e3 registry.access.redhat.com/rhel7/pod-infrastructure:latest "/usr/bin/pod" 37 seconds ago Up 35 seconds k8s_POD.17af0ba2_nginx-2187705812-llnn1_default_bca68cc3-3a6b-11ea-af25-000c29d2651b_b885408b #然后删除deployment [root@kube-master ~]# kubectl delete deployment nginx deployment "nginx" deleted [root@kube-master ~]# kubectl get deployment No resources found. [root@kube-master ~]# kubectl get pods No resources found. #稍等一会儿到node节点上查看docker实例 #节点node1上的镜像实例已经没有了 [root@kube-node1 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES #节点node2上也没有生成新的镜像实例 [root@kube-node2 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3)kubectl create加载YAML文件生成deployment或pod
使用kubectl run在设定一个复杂需求时,需要使用非常长的语句,容易出错且无法保存。所以在这种情况下,一般会使用YAML或JSON文件。
制作deployment文件,用于创建或删除mysql资源。
[root@kube-master ~]# vim mysql-deployment.yaml kind: Deployment apiVersion: extensions/v1beta1 metadata: #当前资源元数据(属性)(Deployment) name: mysql #Deployment名称 spec: #当前资源内容详细定义(Deployment) replicas: 1 #Pod副本期待数量 template: #Pod模板 metadata: #当前资源元数据(属性)(Pod) labels: #标签 name: mysql spec: #当前资源内容详细定义(Pod) containers: #Pod中容器列表定义 - name: mysql #docker容器实例名称的一部分 image: docker.io/mysql/mysql-server #对应的Docker镜像 imagePullPolicy: IfNotPresent #镜像拉取策略,如果本地没有则下载 ports: #容器对外开放端口号 - containerPort: 3306 #容器对外开放端口号 protocol: TCP #协议类型 env: #环境变量 - name: MYSQL_ROOR_PASSWORD #这里设置的是mysql的root密码 value: "hello123"
根据YAML文件创建Deployment资源
#在节点上下载镜像或加载镜像 [root@kube-node1 ~]# docker pull docker.io/mysql/mysql-server Using default tag: latest Trying to pull repository docker.io/mysql/mysql-server ... latest: Pulling from docker.io/mysql/mysql-server c7127dfa6d78: Pull complete 530b30ab10d9: Pull complete 59c6388c2493: Pull complete cca3f8362bb0: Pull complete Digest: sha256:7cd104d6ff11f7e6a16087f88b1ce538bcb0126c048a60cd28632e7cf3dbe1b7 Status: Downloaded newer image for docker.io/mysql/mysql-server:latest [root@kube-node2 ~]# docker pull docker.io/mysql/mysql-server Using default tag: latest Trying to pull repository docker.io/mysql/mysql-server ... latest: Pulling from docker.io/mysql/mysql-server c7127dfa6d78: Pull complete 530b30ab10d9: Pull complete 59c6388c2493: Pull complete cca3f8362bb0: Pull complete Digest: sha256:7cd104d6ff11f7e6a16087f88b1ce538bcb0126c048a60cd28632e7cf3dbe1b7 Status: Downloaded newer image for docker.io/mysql/mysql-server:latest #使用YAML文件创建Deployment [root@kube-master ~]# kubectl create -f mysql-deployment.yaml deployment "mysql" created [root@kube-master ~]# kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE mysql 1 1 1 1 19s nginx 1 1 1 1 29d [root@kube-master ~]# kubectl get replicaset NAME DESIRED CURRENT READY AGE mysql-2118902952 1 1 1 32s nginx-2187705812 1 1 1 29d [root@kube-master ~]# kubectl get pod NAME READY STATUS RESTARTS AGE mysql-2118902952-q93x0 1/1 Running 0 38s nginx-2187705812-cbb2s 1/1 Running 2 29d
根据YAML文件删除Deployment资源
[root@kube-master ~]# kubectl delete -f mysql-deployment.yaml deployment "mysql" deleted [root@kube-master ~]# kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx 1 1 1 1 29d [root@kube-master ~]# kubectl get replicaset NAME DESIRED CURRENT READY AGE nginx-2187705812 1 1 1 29d [root@kube-master ~]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-2187705812-cbb2s 1/1 Running 2 29d
举例:当docker查看时的容器实例名称为k8s_mysql-1.694e284a_mysql-1683940614-fm6pf_default_57c24466-5222-11ea-90a6-000c29d2651b_ca0ad9f0,其中mysql-1是YAML中设置的容器实例的部分名称,mysql-1683940614-fm6pf为pod名称,default为所属命名空间。
4)kubectl get获取信息
kubectl get用的比较多,常用来获取当前k8s的一些基本信息,可以获取内容如下
[root@kube-master ~]# kubectl get certificatesigningrequest persistentvolumeclaim cluster pod clusterrole poddisruptionbudget clusterrolebinding podsecuritypolicy componentstatus podtemplate configmap replicaset cronjob replicationcontroller daemonset resourcequota deployment role endpoints rolebinding event secret horizontalpodautoscaler securitycontextconstraints ingress service job serviceaccount limitrange statefulset namespace status networkpolicy storageclass node thirdpartyresource persistentvolume thirdpartyresourcedata
5)kubectl describe获取详细信息
kubectl describe可以用于获取一个或多个对象的详细信息,如果没有指定对象,将返回该类型的所有对象详细信息。可以操作类型如下:
[root@kube-master ~]# kubectl describe certificatesigningrequest persistentvolume configmap persistentvolumeclaim cronjob pod daemonset poddisruptionbudget deployment replicaset endpoints replicationcontroller horizontalpodautoscaler resourcequota ingress secret job securitycontextconstraints limitrange service namespace serviceaccount networkpolicy statefulset node storageclass
6)kubectl logs查看pod中镜像日志
kubectl logs是排除故障时的重要信息来源(端口号10250)
[root@kube-master ~]# kubectl logs mysql-1683940614-fm6pf [Entrypoint] MySQL Docker Image 8.0.19-1.1.15 [Entrypoint] No password option specified for new database. [Entrypoint] A random onetime password will be generated. [Entrypoint] Initializing database 2020-02-18T07:43:25.144854Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.19) initializing of server in progress as process 22 2020-02-18T07:43:29.167752Z 5 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option. [Entrypoint] Database initialized 2020-02-18T07:43:33.495646Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.19) starting as process 70 2020-02-18T07:43:34.341561Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. 2020-02-18T07:43:34.395848Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.19' socket: '/var/lib/mysql/mysql.sock' port: 0 MySQL Community Server - GPL. 2020-02-18T07:43:34.652186Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: '/var/run/mysqld/mysqlx.sock' Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it. Warning: Unable to load '/usr/share/zoneinfo/leapseconds' as time zone. Skipping it. Warning: Unable to load '/usr/share/zoneinfo/tzdata.zi' as time zone. Skipping it. Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it. Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it. [Entrypoint] GENERATED ROOT PASSWORD: m0Nam=OGyDYD3hQowgibazQeRim [Entrypoint] ignoring /docker-entrypoint-initdb.d/* 2020-02-18T07:43:39.876989Z 10 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.19). 2020-02-18T07:43:41.794714Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.19) MySQL Community Server - GPL. [Entrypoint] Server shut down [Entrypoint] Setting root user as expired. Password will need to be changed before database can be used. [Entrypoint] MySQL init process done. Ready for start up. [Entrypoint] Starting MySQL 8.0.19-1.1.15 2020-02-18T07:43:42.235423Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.19) starting as process 1 2020-02-18T07:43:42.988688Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. 2020-02-18T07:43:43.047254Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.19' socket: '/var/lib/mysql/mysql.sock' port: 3306 MySQL Community Server - GPL. 2020-02-18T07:43:43.175377Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: '/var/run/mysqld/mysqlx.sock' bind-address: '::' port: 33060
7)kubectl exec容器内执行命令
有两种使用方式,第一种方式直接跟随pod容器和命令,如下:
[root@kube-master ~]# kubectl exec mysql-1683940614-fm6pf cat /etc/my.cnf # For advice on how to change settings please see # http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html [mysqld] # # Remove leading # and set to the amount of RAM for the most important data # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%. # innodb_buffer_pool_size = 128M # # Remove leading # to turn on a very important data integrity option: logging # changes to the binary log between backups. # log_bin # # Remove leading # to set options mainly useful for reporting servers. # The server defaults are faster for transactions and fast SELECTs. # Adjust sizes as needed, experiment to find the optimal values. # join_buffer_size = 128M # sort_buffer_size = 2M # read_rnd_buffer_size = 2M # Remove leading # to revert to previous value for default_authentication_plugin, # this will increase compatibility with older clients. For background, see: # https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin # default-authentication-plugin=mysql_native_password skip-host-cache skip-name-resolve datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock secure-file-priv=/var/lib/mysql-files user=mysql pid-file=/var/run/mysqld/mysqld.pid
第二种方式,使用-it选项进入到容器内部,再进行操作
[root@kube-master ~]# kubectl exec mysql-1683940614-fm6pf -it bash bash-4.2# ls bin etc lib64 proc sys boot healthcheck.cnf media root tmp dev healthcheck.sh mnt run usr docker-entrypoint-initdb.d home mysql-init-complete sbin var entrypoint.sh lib opt srv bash-4.2# exit exit
8)kubectl cp物理机与容器间拷贝
kubectl cp [Pod名称]:[容器内的绝对目录] [物理机的绝对目录],这是将容器内文件拷贝到物理机上。
kubectl cp [物理机的绝对目录] [Pod名称]:[容器内的绝对目录],这是将物理机上文件拷贝到容器内。
注意:在使用kubectl cp命令时,需要保证容器内存在tar工具
[root@kube-master ~]# kubectl exec mysql-1683940614-fm6pf -it bash bash-4.2# yum -y install tar ...... bash-4.2# exit exit #从物理机拷贝到容器中 [root@kube-master ~]# kubectl cp mysql-deployment.yaml mysql-1683940614-fm6pf:/ [root@kube-master ~]# kubectl exec mysql-1683940614-fm6pf -it bash bash-4.2# ls bin etc lib64 opt srv boot healthcheck.cnf media proc sys dev healthcheck.sh mnt root tmp docker-entrypoint-initdb.d home mysql-deployment.yaml run usr entrypoint.sh lib mysql-init-complete sbin var bash-4.2# ls /var/log/ mysqld.log tallylog yum.log bash-4.2# exit exit #从容器中拷贝到物理机上 [root@kube-master ~]# kubectl cp mysql-1683940614-fm6pf:/var/log/mysqld.log /root/ tar: Removing leading `/' from member names error: open /root: is a directory #需要指定文件名 [root@kube-master ~]# kubectl cp mysql-1683940614-fm6pf:/var/log/mysqld.log /root/mysqld.log tar: Removing leading `/' from member names [root@kube-master ~]# ls anaconda-ks.cfg example.yaml mysql-deployment.yaml mysqld.log
9)kubectl attach实时监测Pod容器
kubectl attach有些类似于tail -f [文件],实时查看文件的变化,当然这里查看的是日志文件。
[root@kube-master ~]# kubectl attach mysql-1683940614-fm6pf If you don't see a command prompt, try pressing enter. [Entrypoint] MySQL Docker Image 8.0.19-1.1.15 [Entrypoint] No password option specified for new database. [Entrypoint] A random onetime password will be generated. 2020-02-19T02:38:03.354513Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.19) initializing of server in progress as process 22 2020-02-19T02:38:09.595816Z 5 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option. [Entrypoint] Initializing database 2020-02-19T02:38:15.425724Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.19) starting as process 70 2020-02-19T02:38:17.312841Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. 2020-02-19T02:38:17.404453Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.19' socket: '/var/lib/mysql/mysql.sock' port: 0 MySQL Community Server - GPL. [Entrypoint] Database initialized 2020-02-19T02:38:17.505308Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: '/var/run/mysqld/mysqlx.sock' Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it. Warning: Unable to load '/usr/share/zoneinfo/leapseconds' as time zone. Skipping it. Warning: Unable to load '/usr/share/zoneinfo/tzdata.zi' as time zone. Skipping it. Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it. Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it. [Entrypoint] GENERATED ROOT PASSWORD: BUnMen@NIqjoSb@s^0cH@KD3GAK 2020-02-19T02:38:23.591510Z 10 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.19). [Entrypoint] ignoring /docker-entrypoint-initdb.d/* 2020-02-19T02:38:25.338584Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.19) MySQL Community Server - GPL. [Entrypoint] Server shut down [Entrypoint] Setting root user as expired. Password will need to be changed before database can be used. [Entrypoint] MySQL init process done. Ready for start up. [Entrypoint] Starting MySQL 8.0.19-1.1.15 2020-02-19T02:38:26.005956Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.19) starting as process 1 2020-02-19T02:38:26.917802Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. 2020-02-19T02:38:26.978916Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.19' socket: '/var/lib/mysql/mysql.sock' port: 3306 MySQL Community Server - GPL. 2020-02-19T02:38:27.019494Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: '/var/run/mysqld/mysqlx.sock' bind-address: '::' port: 33060
10)kubectl管理集群中deployment资源和service服务
涉及到以下命令:
kubectl edit 使用默认编辑器编辑服务器上定义的资源
kubectl replace 使用配置文件或标准输入替换资源
kubectl patch 使用patch补丁修改、更新资源的字段
kubectl apply 使用配置文件或标准输入更改资源
kubectl scale 扩容或缩容 Deployment、ReplicaSet、Replication Controller或 Job 中Pod数量。scale也可以指定多个前提条件,如:当前副本数量或 --resource-version ,进行伸缩比例设置前,系统会先验证前提条件是否成立。
kubectl autoscale 使用autoscaler自动设置在k8s集群中运行的pod数量(水平自动伸缩)。指定Deployment、ReplicaSet或ReplicationController,并创建已经定义好资源的自动伸缩器。使用自动伸缩器可以根据需要自动增加或减少系统中部署的pod数量。
kubectl cordon 将节点标记为不可调度
kubectl uncordon 将节点标记为可以调度
kubectl drain 将节点标记为维护状态
清理一下存在的pod
[root@kube-master ~]# kubectl get pod NAME READY STATUS RESTARTS AGE mysql-1683940614-fm6pf 1/1 Running 1 23h nginx-2187705812-cbb2s 1/1 Running 3 30d [root@kube-master ~]# kubectl delete -f mysql-deployment.yaml deployment "mysql" deleted [root@kube-master ~]# kubectl delete deployment nginx deployment "nginx" deleted [root@kube-master ~]# kubectl get pod No resources found.
制作nginx-deployment.yaml资源文件和nginx-service.yaml服务配置文件
[root@kube-master ~]# vim nginx-deployment.yaml kind: Deployment apiVersion: extensions/v1beta1 metadata: name: nginx spec: replicas: 1 template: metadata: labels: name: nginx spec: containers: - name: nginx image: docker.io/nginx:latest imagePullPolicy: IfNotPresent ports: - containerPort: 80 protocol: TCP [root@kube-master ~]# vim nginx-service.yaml kind: Service apiVersion: v1 metadata: name: nginx spec: type: NodePort ports: #通过端口映射允许外部访问 - protocol: TCP #协议 port: 8081 #集群内部访问端口 nodePort: 31001 #节点(物理机)上的端口 targetPort: 80 #(容器)目标端口 selector: name: nginx
通过这两个文件创建deployment和service,并查看
[root@kube-master ~]# kubectl create -f nginx-deployment.yaml deployment "nginx" created [root@kube-master ~]# kubectl create -f nginx-service.yaml service "nginx" created [root@kube-master ~]# kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx 1 1 1 1 14m [root@kube-master ~]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-1011335894-g18mm 1/1 Running 0 14m [root@kube-master ~]# kubectl get service NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.254.0.1 <none> 443/TCP 35d nginx 10.254.33.167 <nodes> 8081:31001/TCP 50s
注意:需要确保节点服务器开启转发功能
[root@kube-node1 ~]# vim /etc/sysctl.conf //这是永久开启转发功能 //添加或修改如下行 net.ipv4.ip_forward = 1 [root@kube-node1 ~]# sysctl -p //刷新使参数生效 net.ipv4.ip_forward = 1
接着就可以使用外网访问该服务了。
也测试一下Pod间访问
[root@kube-master ~]# kubectl create -f mysql-deployment.yaml deployment "mysql" created [root@kube-master ~]# kubectl exec mysql-1683940614-p700p -it bash bash-4.2# curl 10.254.33.167:8081 #8081可以访问 <!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> bash-4.2# curl 10.254.33.167:80 #80不可以访问 curl: (7) Failed connect to 10.254.33.167:80; Connection timed out bash-4.2# exit exit
A.kubectl edit编辑器修改
[root@kube-master ~]# kubectl edit service nginx # Please edit the object below. Lines beginning with a '#' will be ignored, # and an empty file will abort the edit. If an error occurs while saving this f ile will be # reopened with the relevant failures. # apiVersion: v1 kind: Service metadata: creationTimestamp: 2020-02-20T03:08:14Z name: nginx namespace: default resourceVersion: "178017" selfLink: /api/v1/namespaces/default/services/nginx uid: 3bda3bd7-538e-11ea-b10c-000c29d2651b spec: clusterIP: 10.254.33.167 ports: - nodePort: 31002 #修改外网端口 port: 8081 protocol: TCP targetPort: 80 selector: name: nginx sessionAffinity: None type: NodePort status: loadBalancer: {} [root@kube-master ~]# kubectl get service NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.254.0.1 <none> 443/TCP 36d nginx 10.254.33.167 <nodes> 8081:31002/TCP 43m
外网查看
B.kubectl replace
[root@kube-master ~]# kubectl get service nginx -o yaml > nginx_replace.yaml [root@kube-master ~]# vim nginx_replace.yaml apiVersion: v1 kind: Service metadata: creationTimestamp: 2020-02-20T03:08:14Z name: nginx namespace: default resourceVersion: "181141" selfLink: /api/v1/namespaces/default/services/nginx uid: 3bda3bd7-538e-11ea-b10c-000c29d2651b spec: clusterIP: 10.254.33.167 ports: - nodePort: 31001 #注意,部分老版本是不能改回原来的IP地址的,否则会报错 port: 8081 protocol: TCP targetPort: 80 selector: name: nginx sessionAffinity: None type: NodePort status: loadBalancer: {} [root@kube-master ~]# kubectl replace -f nginx_replace.yaml service "nginx" replaced [root@kube-master ~]# kubectl get service nginx NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx 10.254.33.167 <nodes> 8081:31001/TCP 3h
外网查看
C.kubectl patch
#更换镜像 [root@kube-master ~]# kubectl patch pod nginx-1011335894-g18mm -p '{"spec":{"containers":[{"name":"nginx","image":"docker.io/richarvey/nginx-php-fpm:latest"}]}}' "nginx-1011335894-g18mm" patched [root@kube-master ~]# kubectl describe pod nginx-1011335894-g18mm Name: nginx-1011335894-g18mm Namespace: default Node: kube-node1/192.168.128.111 Start Time: Wed, 19 Feb 2020 16:30:06 +0800 Labels: name=nginx pod-template-hash=1011335894 Status: Running IP: 10.255.30.2 Controllers: ReplicaSet/nginx-1011335894 Containers: nginx: Container ID: docker://4b75f63c4235535c3ee2209cff5e0733d2a0a933f0fec0154599a05d8a496b2f Image: docker.io/richarvey/nginx-php-fpm:latest Image ID: docker-pullable://docker.io/richarvey/nginx-php-fpm@sha256:a312a923fe36bfb630621480a03a799285936cb90a143fbb76e9da29815c05dc Port: 80/TCP State: Running Started: Thu, 20 Feb 2020 15:18:57 +0800 Last State: Terminated Reason: Completed Exit Code: 0 Started: Thu, 20 Feb 2020 09:02:18 +0800 Finished: Thu, 20 Feb 2020 15:16:22 +0800 Ready: True Restart Count: 2 Volume Mounts: <none> Environment Variables: <none> Conditions: Type Status Initialized True Ready True PodScheduled True No volumes. QoS Class: BestEffort Tolerations: <none> Events: FirstSeen LastSeen Count From SubObjectPath Type Reason Message --------- -------- ----- ---- ------------- -------- ------ ------- 6m 6m 1 {kubelet kube-node1} spec.containers{nginx} Normal Killing Killing container with docker id 60052f3ed6fc: pod "nginx-1011335894-g18mm_default(08986775-52f2-11ea-a0eb-000c29d2651b)" container "nginx" hash changed (549914156 vs 3468627213), it will be killed and re-created. 6m 6m 1 {kubelet kube-node1} spec.containers{nginx} Normal Pulling pulling image "docker.io/richarvey/nginx-php-fpm:latest" 6h 4m 3 {kubelet kube-node1} Warning MissingClusterDNS kubelet does not have ClusterDNS IP configured and cannot create Pod using "ClusterFirst" policy. Falling back to DNSDefault policy. 4m 4m 1 {kubelet kube-node1} spec.containers{nginx} Normal Pulled Successfully pulled image "docker.io/richarvey/nginx-php-fpm:latest" 4m 4m 1 {kubelet kube-node1} spec.containers{nginx} Normal Created Created container with docker id 4b75f63c4235; Security:[seccomp=unconfined] 4m 4m 1 {kubelet kube-node1} spec.containers{nginx} Normal Started Started container with docker id 4b75f63c4235 #可以看到新的镜像可以使用php [root@kube-master ~]# kubectl exec nginx-1011335894-g18mm -it bash bash-5.0# php -v PHP 7.4.2 (cli) (built: Jan 24 2020 07:18:03) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Zend OPcache v7.4.2, Copyright (c), by Zend Technologies
外网查看一下
D.kubectl apply
[root@kube-master ~]# vim nginx-service.yaml kind: Service apiVersion: v1 metadata: name: nginx spec: type: NodePort ports: - protocol: TCP port: 8081 nodePort: 31003 targetPort: 80 selector: name: nginx [root@kube-master ~]# kubectl apply -f nginx-service.yaml service "nginx" configured [root@kube-master ~]# kubectl get service NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.254.0.1 <none> 443/TCP 36d nginx 10.254.33.167 <nodes> 8081:31003/TCP 4h
外网查看
E.kubectl scale
scale横向扩展是k8s这类编辑器平台的重要功能之一。
[root@kube-master ~]# kubectl get pod -o wide | grep nginx NAME READY STATUS RESTARTS AGE IP NODE nginx-1011335894-g18mm 1/1 Running 2 23h 10.255.30.2 kube-node1 [root@kube-master ~]# kubectl scale --current-replicas=1 --replicas=3 deployment/nginx deployment "nginx" scaled [root@kube-master ~]# kubectl get deployment nginx NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx 3 3 3 3 23h [root@kube-master ~]# kubectl get pod -o wide | grep nginx nginx-1011335894-g18mm 1/1 Running 2 23h 10.255.30.2 kube-node1 nginx-1011335894-sdjg7 1/1 Running 0 2m 10.255.87.3 kube-node2 nginx-1011335894-tktff 1/1 Running 0 2m 10.255.30.3 kube-node1
F.kubectl autoscale
autoscale通过设置最大值和最小值,自动根据负载进行调整。
[root@kube-master ~]# kubectl autoscale deployment nginx --min=2 --max=5 deployment "nginx" autoscaled
注意:最大值不能小于当前存在的数量
H.kubectl cordon或uncordon
当节点服务器发生故障时,需要对服务器进行封锁。完成修复时,再进行解封。
[root@kube-master ~]# kubectl get node -o wide NAME STATUS AGE EXTERNAL-IP kube-node1 Ready 35d <none> kube-node2 Ready 35d <none> [root@kube-master ~]# kubectl get pod -o wide | grep nginx nginx-1011335894-g18mm 1/1 Running 2 23h 10.255.30.2 kube-node1 nginx-1011335894-sdjg7 1/1 Running 0 17m 10.255.87.3 kube-node2 nginx-1011335894-tktff 1/1 Running 0 17m 10.255.30.3 kube-node1 [root@kube-master ~]# kubectl cordon kube-node2 node "kube-node2" cordoned [root@kube-master ~]# kubectl get node -o wide NAME STATUS AGE EXTERNAL-IP kube-node1 Ready 35d <none> kube-node2 Ready,SchedulingDisabled 35d <none> [root@kube-master ~]# kubectl get pod -o wide | grep nginx #原有的并不会立即消失 nginx-1011335894-g18mm 1/1 Running 2 1d 10.255.30.2 kube-node1 nginx-1011335894-sdjg7 1/1 Running 0 41m 10.255.87.3 kube-node2 nginx-1011335894-tktff 1/1 Running 0 41m 10.255.30.3 kube-node1 [root@kube-master ~]# kubectl scale --replicas=4 deployment nginx deployment "nginx" scaled [root@kube-master ~]# kubectl get pod -o wide | grep nginx #但不会再往node2节点添加新的Pod nginx-1011335894-g18mm 1/1 Running 2 1d 10.255.30.2 kube-node1 nginx-1011335894-hb9rz 1/1 Running 0 11s 10.255.30.4 kube-node1 nginx-1011335894-sdjg7 1/1 Running 0 42m 10.255.87.3 kube-node2 nginx-1011335894-tktff 1/1 Running 0 42m 10.255.30.3 kube-node1
解封
[root@kube-master ~]# kubectl uncordon kube-node2 node "kube-node2" uncordoned [root@kube-master ~]# kubectl get node -o wide NAME STATUS AGE EXTERNAL-IP kube-node1 Ready 35d <none> kube-node2 Ready 35d <none>
I.kubectl drain
drain比cordon多了一个驱逐节点上的Pod,用的相对较多。解封一样使用的是uncordon
[root@kube-master ~]# kubectl get node -o wide NAME STATUS AGE EXTERNAL-IP kube-node1 Ready 35d <none> kube-node2 Ready 35d <none> [root@kube-master ~]# kubectl get pod -o wide | grep nginx nginx-1011335894-g18mm 1/1 Running 2 1d 10.255.30.2 kube-node1 nginx-1011335894-hb9rz 1/1 Running 0 4m 10.255.30.4 kube-node1 nginx-1011335894-sdjg7 1/1 Running 0 47m 10.255.87.3 kube-node2 nginx-1011335894-tktff 1/1 Running 0 47m 10.255.30.3 kube-node1 [root@kube-master ~]# kubectl drain kube-node1 node "kube-node1" cordoned pod "nginx-1011335894-g18mm" evicted pod "nginx-1011335894-tktff" evicted pod "nginx-1011335894-hb9rz" evicted node "kube-node1" drained [root@kube-master ~]# kubectl get node -o wide NAME STATUS AGE EXTERNAL-IP kube-node1 Ready,SchedulingDisabled 35d <none> kube-node2 Ready 35d <none> [root@kube-master ~]# kubectl get pod -o wide | grep nginx nginx-1011335894-d0mxj 1/1 Running 0 29s 10.255.87.5 kube-node2 nginx-1011335894-hhz1f 1/1 Running 0 29s 10.255.87.4 kube-node2 nginx-1011335894-sdjg7 1/1 Running 0 48m 10.255.87.3 kube-node2 nginx-1011335894-zh2zw 1/1 Running 0 29s 10.255.87.6 kube-node2
解封
[root@kube-master ~]# kubectl uncordon kube-node1 node "kube-node1" uncordoned [root@kube-master ~]# kubectl get node -o wide NAME STATUS AGE EXTERNAL-IP kube-node1 Ready 35d <none> kube-node2 Ready 35d <none> [root@kube-master ~]# kubectl get pod -o wide | grep nginx nginx-1011335894-d0mxj 1/1 Running 0 1m 10.255.87.5 kube-node2 nginx-1011335894-hhz1f 1/1 Running 0 1m 10.255.87.4 kube-node2 nginx-1011335894-sdjg7 1/1 Running 0 49m 10.255.87.3 kube-node2 nginx-1011335894-zh2zw 1/1 Running 0 1m 10.255.87.6 kube-node2
(5).模板文件
众所周知的槽点:k8s没有提供对apiVersion的任何指导,目前可以先对照https://matthewpalmer.net/kubernetes-app-developer/articles/kubernetes-apiversion-definition-guide.html这个网址来选择,后期我会单独写一篇。
Pod模板文件大致如下:
apiVersion: v1 #必选,指定api版本, kind: Pod #必选,指定创建角色的资源类型 metadata: #必选,指定资源的元数据(属性) name: [String] #必选,资源的名称,在同一个命名空间内必须唯一 namespace: [String] #可选,资源所处的命名空间,默认default labels: #可选,自定义标签列表 - [name]: [String] #数组整体复数可选,自定义标签内容 annotations: #可选,自定义注释列表 - [name]: [String] #数组整体复数可选,自定义注释内容 spec: #必选,指定资源内容的详细定义 containers: #必选,指定Pod中容器列表 - name: [String] #指定容器名称(docker容器实例名称的一部分) images: [String] #必选,指定容器镜像 imagesPullPolicy: [Always | Never | IfNotPresent] #可选,指定镜像拉取策略,Always表示总是下载镜像,Never表示只使用本地镜像,IfNotPresent表示如果本地没有镜像再下载。默认IfNotPresent command: [String] #可选,指定容器的启动命令,如果没有指定使用打包时使用的启动命令 args: [String] #可选,指定容器启动时的命令参数 workingDir: [String] #可选,指定容器的工作目录,没有指定使用Docker的默认 ports: #可选,指定容器对外开放端口列表 - name: [String] #数组整体复数可选,端口名称 containerPort: [int] #容器对外开放端口 hostPort: [number] #映射到主机端口号,一般设置为与containerPort相同 protocol: [String] #端口协议 env: #可选,指定容器运行的环境变量列表 - name: [String] #数组整体复数可选,环境变量名称 value: [String] #环境变量的值 resources: #可选,指定容器运行的资源限制 limits: #容器运行资源上限 cpu: [String] #CPU资源,1(核)=1000m,m表示千分之一个内核,故有两种书写方式 memory: [String] #内存资源,单位Mi/Gi/M/G...。在k8s中单位没有i,表示以1000作为进制单位;单位有i,表示1024作为进制单位 requests: #容器运行资源下限 cpu: [String] memory: [String] volumeMounts: #可选,指定挂载到容器内部的存储卷配置 - name: [String] #数组整体复数可选,引用Pod中定义的共享存储卷(volume)的名称 mountPath: [String] #存储卷挂载到容器内部的绝对地址,应少于512字符 readOnly: [String] #存储卷是否为只读模式 livenessProbe: #指定对Pod内容器进行健康检查的设置。当探测无响应几次时,将会自动重启该容器,exec、httpGet和tcpSocket三选一进行设置 exec: #三选一设置,执行检测 command: [String] #设置执行命令或脚本 httpGet: #三选一设置,http获取检测 path: [String] #URI地址 port: [number] #端口号 host: [String] #主机地址 scheme: [String] #跳转协议 HttpHeaders: #http头信息 - name: [String] #信息名称 value: [String] #对应的值 tcpSocket: #三选一设置,tcp套字节检测 port: [number] #端口号 initialDelaySeconds: [number] #容器启动后首次探测时间,单位秒 timeoutSeconds: [number] #检测超时时间,单位秒 periodSeconds: [number] #检测间隔时间,单位秒 successThreshold: [number] #成功阈值,检测成功多少次算健康 failureThreshold: [number] #失败阈值,检测失败多少次需要重启 securityContext: #安全环境 privileged: [Boolean] #是否允许特权,一般都是不允许false restartPolicy: [Always | Never |OnFailure] #可选,Pod重启策略,Always表示只要Pod停止就重启,Never表示Pod停止后不重启,OnFailure表示正常退出不重启。默认Always nodeSelector: [object] #可选,节点选择器 imagePullSecrets: #可选,镜像拉取密钥。k8s可以创建secret(机密)注册表,其内主要保存docker连接的服务器、用户名和密码等信息。 - name: [String] #数组整体复数可选,通过secret(机密)注册表名称,选择连接不同的docker仓库 hostNetwork: [Boolean] #是否使用主机网络,默认为false volumes: #可选,在该Pod上定义共享存储卷列表 - name: [String] #数组整体复数可选,存储卷名称。类型多选一,并不止以下四种 emptyDir: {} #类型为emptyDir的存储卷,与Pod同生命周期的临时目录,保证容器意外死亡时数据存留,为空值。 hostPath: #类型为hostPath的存储卷,将主机文件系统上的文件或目录挂载到Pod中 path: [String] #主机文件系统上的文件或目录,与容器中vloumeMounts设置里的mountPath相呼应 secret: #类型为secret(机密)的存储卷,将主机文件系统上的文件或目录挂载到Pod中 scretname: [String] #secret名称 items: #项目 - key: [String] #关键词 path: [String] #扩展地址,相对路径。容器中实际路径为vloumeMounts设置里的mountPath+扩展地址 configMap: #类型为configMap的存储卷 name: [String] #configMap名称 items: #项目 - key: [String] #关键词 path: [String] #扩展地址,相对路径。容器中实际路径为vloumeMounts设置里的mountPath+扩展地址
当然,有些容器可以设置的属性:name、image、command、args、workingDir、ports、env、resources、volumeMounts、livenessProbe、readinessProbe、livecycle、terminationMessagePath、imagePullPolicy、securityContext、stdin、stdinOnce、tty。
service配置文件模板如下:
apiVersion: v1 #必选,指定api版本 kind: Service #必选,指定创建角色的资源类型 matadata: #必选,指定资源的元数据(属性) name: [String] #必选,资源名称,在同一命名空间内必选唯一 namespace: [String] #可选,资源所处的命名空间,默认default labels: #可选,自定义标签列表 - [name]: [String] #数组整体复数可选,自定义标签内容 annotations: #可选,自定义注释列表 - [name]: [String] #数组整体复数可选,自定义注释内容 spec: #必选,指定资源内容的详细定义 selector: #必选,选择具有指定标签的Pod作为管理范围 - [name]: [String] #管理范围定义 type: [ClusterIP | NodePort | LoadBalancer] #可选,指定服务的访问方式,默认为ClusterIP。 #ClusterIP表示集群IP(虚拟IP)模式,用于k8s集群内部Pod的互相访问,在节点上kube-proxy通过设置iptables规则进行转发; #NodePort表示节点端口模式,用于外部访问k8s集群内部的Pod,在外部客户端上通过节点的IP和端口访问服务; #LoadBalancer表示负载均衡器模式,使用外接的负载均衡完成服务的负载分发,需要在spec.status.loadBalancer指定外部负载均衡器的IP地址,并同时定义ClusterIP和NodePort用于公有云。 clusterIP: [String] #指定当前服务在集群内部的IP地址。服务访问方式为ClusterIP时可选,如果不指定系统自动分配;服务访问方式为LoadBalancer时,必须手动设置。 sessionAffinity: [ClientIP | None] #可选,是否支持Session,默认为空(None)。Session表示同一个源IP地址的客户端请求都发给同一个后端Pod ports: #可选,服务对外开放端口列表 - name: [String] #数组整体复数可选,端口自定义名称 protocol: [TCP | UDP] #端口协议,默认TCP port: [int] #提供给内部Pod访问使用的端口 targetPort: [int] #Pod内部服务的端口 nodePort: [int] #提供给外部访问的节点上的端口 status: loadBalancer: ingress: ip: [String] #外接负载均衡器的IP地址 hostname: [String] #外接负载均衡器的主机名
注意:使用端口映射时需要保证节点上的iptables开启转发功能(iptables -P FORWARD ACCEPT(临时转发))
参考:https://kubernetes.io/zh/docs/reference/kubectl/overview/
https://www.runoob.com/w3cnote/yaml-intro.html
https://blog.csdn.net/luanpeng825485697/article/details/83753260
https://blog.csdn.net/phantom_111/article/details/79427144
https://blog.csdn.net/u011230692/article/details/84490874
https://blog.csdn.net/watermelonbig/article/details/79693962