标签的设置及使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
kubectl get  [资源] -n [名称空间] --show-labels

#查看node标签
[root@master01 ~]# kubectl get nodes --show-labels

#查看pod的标签
[root@master01 ~]# kubectl get pod -n kube-flannel --show-labels

#给node打标签
[root@master01 ~]# kubectl label node node01 MEM=16G
node/node01 labeled
[root@master01 ~]# kubectl get nodes --show-labels

#给node打角色标签:为了区分项目名,或者配置
node-role 角色标签的接口
node-role.kubernetes.io 标识调角色标签的接口
=变成-号,就是删除角色标签 node-
node= :表示给角色打的标签名叫node

[root@master01 ~]# kubectl label node node01 node-role.kubernetes.io/node=
[root@master01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master01 Ready master 5d23h v1.19.3
node01 Ready node 5d23h v1.19.3
node02 Ready node 5d23h v1.19.3
node03 Ready node 5d23h v1.19.3

给pod打标签的方法:    如果不资源清单里面不写标签,起来的pod就没有标签,不会存在默认标签的说法,所以资源清单里面一定要写标签

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#给pod打标签为了以后通信用
方法一:
使用命令打标签:(一般很少用命令打标签,以后起pod是用资源清单的,所以在资源清单里面打标签比较常用)
[root@master01 ~]# kubectl label pod kube-flannel-ds-4ncf5 run=flannel -n kube-flannel
kube-flannel-ds-4ncf5:Pod名
run=flannel:标签名
kube-flannel:名称空间


方法二:
#给Pod打标签(用资源清单打,比较常用)
[root@master01 kubernetes]# vim nginx-label.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
namespace: default
labels:
run: nginx
spec:
containers:
- name: nginx:alpine
image: nginx:alpine
imagePullPolicy: IfNotPresent

运行资源清单
[root@master01 kubernetes]# kubectl apply -f nginx-label.yml
查看
[root@master01 kubernetes]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod 1/1 Running 0 23s run=nginx

将pod起到指定的node上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
上面执行了命令给node01打MEM=16G的标签
[root@master01 ~]# kubectl label node node01 MEM=16G

将pod起在MEM=16的节点上
#启动pod在指定标签的node上
[root@master01 kubernetes]# vim nginx2-label.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod-v2
namespace: default
labels:
run: nginx
spec:
containers:
- name: nginx-container-v2
image: nginx:alpine
imagePullPolicy: IfNotPresent
#将pod起在MEM=16的节点上
nodeSelector:
MEM: 16G


#(一般来说不写如下内容,因为k8s会做资源计算和调度,但是在起redis或者数据库这种pod的时候,他两对内存的使用比较大,建议不要起在同一个机器上,这个情况就要使用如下命令了,避免k8s自己资源计算,将redis、mysql起在同一个机器)
nodeSelector:
MEM: 16G

[root@master01 kubernetes]# kubectl apply -f nginx2-label.yml
pod/nginx-pod-v2 created
[root@master01 kubernetes]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 0 17m
nginx-pod-v2 1/1 Running 0 32s
查看起在node01上的
[root@master01 kubernetes]# kubectl get pod nginx-pod-v2 -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-pod-v2 1/1 Running 0 6m26s 10.2.1.4 node01

删除标签

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
1、先查看
[root@master01 kubernetes]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod 1/1 Running 0 31m run=nginx
nginx-pod-v2 1/1 Running 0 14m run=nginx


2、#删除标签
kubectl label [资源] [资源名] [标签名/标签key]-

[root@master01 kubernetes]# kubectl label pod nginx-pod-v2 run-
[root@master01 kubernetes]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-pod 1/1 Running 0 32m run=nginx
nginx-pod-v2 1/1 Running 0 15m <none>


#根据标签查找pod
3、查看哪些pod打了run=nginx的标签,打了这个标签的都会被列出来
[root@master01 kubernetes]# kubectl get pod -l run=nginx
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 0 35m


#根据标签删除pod
4、打了标签比较方便,可以根据标签去筛选,还可以根据标签去删除pod
[root@master01 kubernetes]# kubectl delete pod -l run=nginx
pod "nginx-pod" deleted

但是一个pod里面起2个容器怎么连
-c 永远只有3个引号
默认连第一个容器
-c指定容器名
#当一个pod中有多个容器时

连接到pod 容器可以使用命令连接进去,pod也可以使用命令连接进去

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#连接到一个pod
[root@master01 kubernetes]# kubectl exec -it nginx-pod-v2 -- /bin/sh
/ # ls
bin etc

--:相当于分隔符,--后面的所有都是命令

#问题:一个pod里面起2个容器怎么连?
1、编写一个pod起2个容器的资源清单
[root@master01 kubernetes]# vim nginx-busybox.yml
apiVersion: "v1"
kind: "Pod"
metadata:
name: nginx-busybox
namespace: default
spec:
containers:
- name: busybox-container
image: busybox
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c","tail -f /etc/hosts"]
#-c:表示永远只有3个引号,第3个引号可以写长的命令
- name: nginx-container
image: nginx:alpine
imagePullPolicy: IfNotPresent

2、运行pod,并查看pod是否起来,查看pod起在哪个机器
[root@master01 kubernetes]# kubectl apply -f nginx-busybox.yml
pod/nginx-busybox created
[root@master01 kubernetes]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-5f5d9d69c4-d8hvx 1/1 Running 0 19h
nginx-busybox 2/2 Running 0 8s
nginx-pod-v2 1/1 Running 0 43m
[root@master01 kubernetes]# kubectl get pod nginx-busybox -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-busybox 2/2 Running 0 3m34s 10.2.2.5 node02

3、连接进入容器
[root@master01 kubernetes]# kubectl exec -it nginx-busybox -- /bin/sh
/ # ls -l /usr
total 0
drwxr-xr-x 2 root root 17 May 18 2023 bin
drwxr-xr-x 2 daemon daemon 6 May 18 2023 sbin

该目录没有站点目录,所以进去的busybox容器,所以默认连第一个容器

4、如果需要连接指定的容器,需要使用选项-c指定
[root@master01 kubernetes]# kubectl exec -it nginx-busybox -c nginx-container -- /bin/sh
/ # ls -l /usr/share/nginx/html/
total 8
-rw-r--r-- 1 root root 497 Aug 14 06:12 50x.html
-rw-r--r-- 1 root root 615 Aug 14 06:12 index.html

-c:连接到指定的容器名

作用:k8s只需要在master上操作,就可以连到需要连的容器

2、重新认识Pod

共享网络

image-20240919110354547

1
2
3
4
5
1、Pod内的容器使用Container模式共享根容器的网络
2、容器看到的网络设备信息和根容器完全相同
3、Pod内的多个容器可以使用localhost进行网络通讯
4、Pod内的多个容器不能绑定相同的端口
5、Pod的生命周期和根容器一样,如果根容器退出,Pod就退出

3、共享文件系统

1、本地共享储存

image-20240919165826698

第一种:hostPath 本地的映射

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#运行数据库
docker run \
--name mysql57 \
-p 3306:3306 \
-v /data/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123 \
-e MYSQL_DATABASE=wp_db \
-e MYSQL_USER=wp_user \
-e MYSQL_PASSWORD=123 \
--restart=always \
-d mysql:5.7.44

1、编写资源清单
[root@master01 kubernetes]# vim wp.yml
apiVersion: "v1"
kind: "Pod"
metadata:
name: mysql57-pod
namespace: default
labels:
app: mysql57
run: mysql57
spec:
#设置挂载映射的写法 指定宿主机的挂载目录
volumes:
- name: mysql-data #名字一定要写,设置挂载的变量,相当于变量名
hostPath:
path: /data/mysql #宿主机的目录,相当于变量值
- name: test-data
hostPath:
path: /opt/test

containers:
- name: mysql57-container
image: mysql:5.7.44
imagePullPolicy: IfNotPresent
env:
- name: MYSQL_ROOT_PASSWORD
value: "123"
- name: MYSQL_DATABASE
value: "wp_db"
- name: MYSQL_USER
value: "wp_user"
- name: MYSQL_PASSWORD
value: "123"
#指定字符集的写法
args:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
#容器里面的目录挂载出来的写法
volumeMounts:
- name: mysql-data #现在容器的目录要挂到宿主机的哪个目录,就写宿主机目录的变量名
mountPath: /var/lib/mysql #这里写容器里需要挂出来的目录

###
--xxx一般用args
如果是一条完整的命令就用command

2、运行资源清单,并查看pod运行的node
[root@master01 kubernetes]# kubectl apply -f mysql.yml
[root@master01 kubernetes]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
mysql57-pod 1/1 Running 0 3m42s 10.2.3.14 node03

3、到node03节点查看目录是否映射
[root@node03 ~]# ll /data/mysql/
-rw-r----- 1 polkitd input 56 Sep 19 18:29 auto.cnf

#目录映射出来了,如果mysql挂了,再拉起,数据是存在的,如果不做映射,k8s自动拉起,数据就会全部没有

容器里面mysql用户的uid gid都是999,宿主机上uid为999的是polkitd,gid为999的是input,系统只认ID,不认字符串,字符串是给人看的,知道名字就更好区分

4、连接到容器里面检查
[root@master01 kubernetes]# kubectl exec -it pod/mysql57-pod -- /bin/sh
sh-4.2# mysql -uroot -p123
mysql> show databases;
mysql> select host,user from mysql.user;
mysql> show create database wp_db;
sh-4.2# mysql -uwp_user -p123
Value Behavior
‌"" 默认不需要创建,会自动创建
DirectoryOrCreate 目录必须存在,权限必须是755
Directory 目录必须存在
FileOrCreate 文件必须存在,权限必须是644
File 文件必须存在
Socket 挂载socket文件
CharDevice 挂载字符设备文件(键盘,鼠标,终端…)
BlockDevice 挂载快设备文件(磁盘,U盘,移动硬盘…)

第二种:emptyDir

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
1、编写资源清单
[root@master01 kubernetes]# vim wp.yml
apiVersion: "v1"
kind: "Pod"
metadata:
name: mysql57-pod
namespace: default
labels:
app: mysql57
run: mysql57
spec:
#设置挂载映射的写法 指定宿主机的挂载目录
volumes:
- name: mysql-data #名字一定要写,设置挂载的变量,相当于变量名
hostPath:
path: /data/mysql #宿主机的目录,相当于变量值
- name: empty-data
emptyDir: {} #默认是空的话就写{}

containers:
- name: mysql57-container
image: mysql:5.7.44
imagePullPolicy: IfNotPresent
env:
- name: MYSQL_ROOT_PASSWORD
value: "123"
- name: MYSQL_DATABASE
value: "wp_db"
- name: MYSQL_USER
value: "wp_user"
- name: MYSQL_PASSWORD
value: "123"
#指定字符集的写法
args:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
#容器里面的目录挂载出来的写法
volumeMounts:
- name: empty-data #现在容器的目录要挂到宿主机的哪个目录,就写宿主机目录的变量名
mountPath: /var/lib/mysql #这里写容器里需要挂出来的目录


2、删除node03的data目录
[root@node03 ~]# rm -rf /data/mysql/

3、删除上一次实验起的pod,重新运行资源清单
[root@master01 kubernetes]# kubectl delete pod mysql57-pod
[root@master01 kubernetes]# kubectl apply -f mysql.yml
[root@master01 kubernetes]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
mysql57-pod 1/1 Running 0 59s 10.2.3.24 node03


4、查询映射的datam目录
[root@node03 ~]# docker inspect 1dd8436185b0
#查找Mounts
"Mounts": [
{
"Type": "bind",
"Source": "/var/lib/kubelet/pods/b3994de1-53ba-4ccf-b3b1-a7bdc8f1b08d/volumes/kubernetes.io~empty-dir/empty-data",

[root@node03 ~]# ll /var/lib/kubelet/pods/b3994de1-53ba-4ccf-b3b1-a7bdc8f1b08d/volumes/kubernetes.io~empty-dir/empty-data
total 188484
-rw-r----- 1 polkitd input 56 Sep 19 20:05 auto.cnf

emptyDir: {}
只是临时使用:随机的临时目录 容器删除,这个目录就会被删除,做不到持久化

作用:在同一个Pod里,2个容器之间的文件是互相隔离的,想让他们互通某个目录就可以使用到,让2个容器同时都挂载到这个目录,这样子这两个容器就找到共享这个目录

将一个POD内的两个容器共享目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
1、编写资源清单
apiVersion: "v1"
kind: "Pod"
metadata:
name: c7-nginx
namespace: default
spec:
volumes:
- name: empty-data
emptyDir: {}
containers:
- name: nginx-container
image: nginx:alpine
imagePullPolicy: IfNotPresent
volumeMounts:
- name: empty-data
mountPath: /usr/share/nginx/html
#让busybox挂到宿主机的随机目录

- name: c7-container
image: centos:7
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c","tail -f /etc/hosts"]
volumeMounts:
- name: empty-data
mountPath: /opt/html
#让c7挂到宿主机的随机目录
#都是挂到宿主机的临时目录,这两个目录里面的文件肯定是互通的

2、运行资源清单,并查看pod运行的node
[root@master01 kubernetes]# kubectl apply -f c7-busybox-emptyDir.yml
pod/c7-nginx created
[root@master01 kubernetes]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
c7-nginx 2/2 Running 0 5s 10.2.3.30 node03

3、测试2个容器是否共享了目录
[root@node03 ~]# docker inspect dbb9f576eacd
"Mounts": [
{
"Type": "bind",
"Source": "/var/lib/kubelet/pods/bed3c777-7aff-4593-a7bc-f2bc3ed47827/volumes/kubernetes.io~empty-dir/empty-data",
"Destination": "/opt/html",
"Mode": "",
"RW": true,
"Propagation": "rprivate"

4、查看挂载的随机目录,是空的
[root@node03 ~]# ll /var/lib/kubelet/pods/bed3c777-7aff-4593-a7bc-f2bc3ed47827/volumes/kubernetes.io~empty-dir/empty-data
total 0

5、连进容器里面查看挂载目录,是空的
[root@master01 kubernetes]# kubectl exec -it c7-nginx -c nginx-container -- /bin/sh
/ # ls -l /usr/share/nginx/html/

[root@master01 ~]# kubectl exec -it c7-nginx -c c7-container -- /bin/bash
[root@c7-nginx /]# ls -l /opt/html/
total 0

6、进入随机目录,并且创建一个文件
[root@node03 ~]# cd /var/lib/kubelet/pods/bed3c777-7aff-4593-a7bc-f2bc3ed47827/volumes/kubernetes.io~empty-dir/empty-data
[root@node03 empty-data]# echo "test 将一个POD内的两个容器共享目录" > index.html

7、进入容器,查看文件可以看到2个容器都可以看到创建的文件内容
/ # cat /usr/share/nginx/html/index.html
test 将一个POD内的两个容器共享目录
/ # curl 127.0.0.1
test 将一个POD内的两个容器共享目录

[root@c7-nginx /]# cat /opt/html/index.html
test 将一个POD内的两个容器共享目录
[root@c7-nginx /]# curl 127.0.0.1
test 将一个POD内的两个容器共享目录


#当Pod结束了,共享就结束了,如果数据很重要,需要持久化,emptyDir就不建议使用,就使用Hostoath

一个pod起在node02,一个起在node03,只能用nfs共享

command后面的命令会让容器把后面的命令当初PID为1的进程,那条命令结束,进程就结束了
1
2
3
4
5
6
7
8
比如说想改nginx端口,想用8080,用资源清单怎么改配置文件
pod不能自动拉取
pod初始化容器,想临时改里面某些东西,比如说添加www用户,统一用户

钩子 启动钩子:启动之前让他做一些事情
停止钩子:pod结束了就停止钩子,结束之前想让他发邮件告警
探针:k8s挂了可以重新拉起,那么pod没挂,但是网站是404或者50几,网站不能正常访问,但是k8s只检测pod有没有挂或者被删除,但是10个pod都是404,pod在,不会重新拉起,就要用探针
存活探针 救续探针 自动扩缩容

wordpress镜像

在一个POD里启动两个容器 wordpress和mysql5.7,用户上传数据的目录做持久化,该打标签的打标签

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#运行数据库
docker run \
--name mysql57 \
-p 3306:3306 \
-v /data/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123 \
-e MYSQL_DATABASE=wp_db \
-e MYSQL_USER=wp_user \
-e MYSQL_PASSWORD=123 \
--restart=always \
-d mysql:5.7.44

#运行wordpress容器
docker run \
--name wp \
--link mysql57 \
-p 80:80 \
-e WORDPRESS_DB_HOST=mysql57 \
-e WORDPRESS_DB_USER=wp_user \
-e WORDPRESS_DB_PASSWORD=123 \
-e WORDPRESS_DB_NAME=wp_db \
-d wordpress-df:v2




[root@master01 kubernetes]# vim wp.yml
apiVersion: "v1"
kind: "Namespace"
metadata:
name: wp
---
apiVersion: v1
kind: Pod
metadata:
name: wp-pod
namespace: wp
spec:
containers:
- name: wp-containers
image: wordpress-df:v2
imagePullPolicy: Never
ports:
- containerPort: 80
env:
- name: WORDPRESS_DB_HOST
value: "localhost"
- name: WORDPRESS_DB_USER
value: "wp_user"
- name: WORDPRESS_DB_PASSWORD
value: "123"
- name: WORDPRESS_DB_NAME
value: "wp_db"

- name: mysql-containers
image: mysql:5.7.44
imagePullPolicy: Never
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "123"
- name: MYSQL_DATABASE
value: "wp_db"
- name: MYSQL_USER
value: "wp_user"
- name: MYSQL_PASSWORD
value: "123"
volumeMounts:
- name: db
mountPath: /var/lib/mysql