本文最后更新于 321 天前,其中的信息可能已经过时,如有错误请发送邮件到wuxianglongblog@163.com
kubernetes扩展内容
一.为Node节点增加污点
1.污点类型
NoExecute:
不再接受新的Pod调度,并且还会驱赶已经调度到当前节点的Pod。
NoSchedule:
不再接受新的Pod调度,但也不会驱赶已经调度到当前Node的Pod。
PreferNoSchedule
该节点可以接收调度,但尽可能的会将Pod调度到其它节点,如果其它节点无法被调度后,依旧也可以调度到当前节点哟。
温馨提示:
如下图所示,K8S1.5版本中并不支持"NoExecute"这种策略哟。
2.给node打标签
kubectl label node k8s103.oldboyedu.com school=
kubectl label node k8s103.oldboyedu.com class=oldboyedu-linux
3.给node删除标签
kubectl label node k8s103.oldboyedu.com school-
kubectl label node k8s103.oldboyedu.com class-
温馨提示:
只要在KEY的名称后面加一个"-"就可以删除该标签哟!
4.添加污点
(1)先对节点打标签
kubectl label node k8s103.oldboyedu.com school=oldboyedu
(2)添加污点
kubectl taint node k8s103.oldboyedu.com school=oldboyedu:NoSchedule
(3)查看污点
kubectl describe node k8s103.oldboyedu.com | grep Taints
5.删除污点
(1)删除污点
kubectl taint node k8s103.oldboyedu.com school-
(2)查看污点是否被成功删除
kubectl describe node k8s103.oldboyedu.com | grep Taints
6.为node打污点对nodeSelector的影响度
[root@k8s110 pod]# vim 10-alpine.yaml
[root@k8s110 pod]#
[root@k8s110 pod]# cat 10-alpine.yaml
apiVersion: v1
kind: Pod
metadata:
name: oldboyedu-linux76-2021-10
spec:
# 指定调度到哪个node节点,无视污点(Taints)
# nodeName: k8s112.oldboyedu.com
# 通过node的标签选择器去选择节点,如果没有匹配的到则处于Pending
# 如果node节点有符合的标签但存在污点,也无法完成调度!
nodeSelector:
school: oldboyedu
containers:
- name: oldboyedu-alpine
image: k8s110.oldboyedu.com:5000/linux/alpine:latest
ports:
- containerPort: 8888
args: ["sleep","300000"]
imagePullPolicy: IfNotPresent
[root@k8s110 pod]#
温馨提示:
为了测试上面的案例,咱们可以对"k8s112.oldboyedu.com"和"k8s112.oldboyedu.com"打上相同的标签.
二.为Pod资源添加容忍度
1.为node打标签
kubectl label node k8s102.oldboyedu.com class=oldboyedu-linux
kubectl label node k8s103.oldboyedu.com class=oldboyedu-linux
2.为node打上污点
kubectl taint node k8s102.oldboyedu.com class=oldboyedu-linux:NoSchedule
kubectl taint node k8s103.oldboyedu.com class=oldboyedu-linux:NoSchedule
3.Pod配置容忍度(K8S 1.5版本并不适用!)
[root@k8s101.oldboyedu.com /oldboyedu/pods]# vim 01-nginx.yaml
[root@k8s101.oldboyedu.com /oldboyedu/pods]#
[root@k8s101.oldboyedu.com /oldboyedu/pods]# cat 01-nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: oldboyedu-nginx
labels:
app: web01
spec:
tolerations:
- key: "class"
value: "oldboyedu-linux"
effect: "NoSchedule"
containers:
- name: nginx
image: k8s101.oldboyedu.com:5000/docker.io/nginx:1.13
ports:
- containerPort: 80
[root@k8s101.oldboyedu.com /oldboyedu/pods]#
三.kubernetes的ConfigMap资源应用案例
1.ConfigMap概述
创建ConfigMap资源后,数据实际会存储在Kubernetes集群中的ETCD数据库,然后通过创建Pod时引入该数据。
应用场景:
应用程序配置。
ConfigMap支持两种数据类型:
(1)键值对;
(2)多行数据;
Pod使用ConfigMap数据有两种方式:
(1)变量注入;
(2)数据卷挂载;
推荐阅读:
https://kubernetes.io/zh/docs/concepts/configuration/configmap/
2.创建ConfigMap资源
vim configmap-demo.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: database-config
data:
# 我们可以基于键值("KEY:VALUE")的形式定义配置属性,下面我定义了两条数据,注意哈,VALUE的值无论是字母还是数字,都必须使用双引号括起来哟~
name: "Jason Yin"
age: "18"
# 我们也可以基于多行数据的形式定义配置属性,即使用"|"来进行换行,这意味着下面的"mysql.properties"对应了多个属性。
mysql.properties: |
host: 172.200.1.201
port: 3306
socket: "/tmp/mysql.sock"
user: "jason"
password: "oldboyedu"
# 注意哈,上面已经有3条数据了(其中两条基于"KEY:VALUE"形式),算上下面这一条多行数据的话,共计4条数据哟~
redis.properties: |
host: 172.200.1.203
port: 6379
requirepass: "oldboyedu"
3.创建Pod并引用ConfigMap资源中的配置
vim configmap-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: db-config-demo
namespace: oldboyedu-configmap
spec:
containers:
- name: demo
image: nginx:1.17
env:
# 注意哈,我们可以自定义变量哟
- name: address
value: "BeiJing"
- name: JAVA_HOME
value: "/oldboyedu/softwares/jdk1.8/"
# 我们的变量可以从Pod中获取
- name: MY_NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: MY_POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
# 我们的变量也可以从ConfigMap中获取
- name: pod-name
valueFrom:
configMapKeyRef:
name: database-config
key: name
- name: pod-age
valueFrom:
configMapKeyRef:
name: database-config
key: age
# 注意哈,此处我们指定了挂载卷信息
volumeMounts:
- name: pod-config # 指定volumes的名称,必须在下面能找到同名的volumes哟~
mountPath: "/config" # 指定挂载点
readOnly: true # 注意哈,我们挂载是以只读的形式挂载的!
# 我们在此处定义了卷组信息,以便于上面来进行引用哟~
volumes:
- name: pod-config
configMap:
name: database-config
items:
- key: "mysql.properties" # 引用自"database-config"的ConfigMap资源定义的"mysql.properties"
path: "pod-mysql.properties" # 注意path只是对应的是文件名称哟~
温馨提示:
需要咱们进入Pod中测试是否注入变量和挂载。
四.kubernetes的Secret资源应用案例
1.Secret概述
与ConfigMap类似,区别在于Secret主要存储铭感数据,所有的数据要经过base64编码。
但对于程序员而言,这依旧是明文数据,只不过想要拿到明文数据需要只需使用base64进行解码即可。
如下所示,基于base64进行编码和解码只需一行命令就搞定了。
[root@k8s103.oldboyedu.com ~]# echo -n "oldboyedu" | base64
b2xkYm95ZWR1
[root@k8s103.oldboyedu.com ~]#
[root@k8s103.oldboyedu.com ~]# echo -n "b2xkYm95ZWR1" | base64 -d
oldboyedu
[root@k8s103.oldboyedu.com ~]#
应用场景:
多用于存储凭据信息。
"kubectl create secret"支持常用的三种数据类型如下:(较ConfigMap支持的类型要多,我们可以理解ConfigMap支持的只是存储文本信息,对于存储仓库认证信息,TLS证书等ConfigMap均不支持,此时我们应该采用Secret哟~)
(1)docker-registry(kubernetes.io/dockerconfigjson):
存储镜像仓库认证信息。
(2)generic(Opaque):
存储密码,秘钥等。
(3)tls(kubernetes.io/tls):
存储TLS证书。
除了上面提到的几种类型,还有其它几种内置的数据类型(我从官网摘抄如下表所示),推荐阅读:
https://kubernetes.io/zh/docs/concepts/configuration/secret/
温馨提示:
[root@k8s103.oldboyedu.com ~]# kubectl get secret # 如下所示,对于"kubernetes.io/service-account-token"这种类型是kubernetes预留的哟~
NAME TYPE DATA AGE
default-token-p4fw6 kubernetes.io/service-account-token 3 9d
k8s-oldboyedu.com kubernetes.io/tls 2 26h
[root@k8s103.oldboyedu.com ~]#
2.将用户名和密码使用"base64"进行编码
base64编码:
[root@k8s103.oldboyedu.com ~]# echo -n "admin" | base64
YWRtaW4=
[root@k8s103.oldboyedu.com ~]#
[root@k8s103.oldboyedu.com ~]# echo -n "oldboyedu" | base64
eWluemhlbmdqaWU=
[root@k8s103.oldboyedu.com ~]#
base64解码:
[root@k8s103.oldboyedu.com ~]# echo "YWRtaW4=" | base64 -d
admin
[root@k8s103.oldboyedu.com ~]#
[root@k8s103.oldboyedu.com ~]# echo "eWluemhlbmdqaWU=" | base64 -d
oldboyedu
[root@k8s103.oldboyedu.com ~]#
3.创建"Secret"资源
cat > secret-demo.yaml <<'EOF'
apiVersion: v1
kind: Secret
metadata:
name: db-user-pass
type: Opaque # 此处我们指定Secret资源的类型为"Opaque",通常用于存储密码,密钥等.
data:
# 将编码后的值放到Secret资源的配置文件中
username: YWRtaW4=
password: eWluemhlbmdqaWU=
EOF
4.在Pod中引用"Secret"资源的配置信息
vim secret-pod-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: db-secret-demo
spec:
containers:
- name: demo
image: nginx:1.17
env:
# 我们的变量可以Secret资源获取哟
- name: USER
valueFrom:
secretKeyRef:
name: db-user-pass
key: username
- name: PASSWD
valueFrom:
secretKeyRef:
name: db-user-pass
key: password
# 注意哈,此处我们指定了挂载卷信息
volumeMounts:
- name: pod-config # 指定volumes的名称,必须在下面能找到同名的volumes哟~
mountPath: "/config" # 指定挂载点
readOnly: true # 注意哈,我们挂在是以只读的形式挂载的!
# 我们在此处定义了卷组信息,以便于上面来进行引用哟~
volumes:
- name: pod-config
secret:
secretName: db-user-pass
items:
- key: "username" # 引用自"database-config"的ConfigMap资源定义的"mysql.properties"
path: "username_info" # 注意path只是对应的是文件名称哟~
5.进入Pod中测试是否注入变量和挂载
测步骤略,现场演示。