9.k8s常用资源补充内容
孙富阳, 江湖人称没人称。多年互联网运维工作经验,曾负责过孙布斯大规模集群架构自动化运维管理工作。擅长Web集群架构与自动化运维,曾负责国内某大型博客网站运维工作。
1.为Node节点增加污点
1.污点的类型
NoExecute
不再接受新的Pod调度,并且还会驱赶已经调度到当前节点的Pod。
NoSchedule
不再接受新的Pod调度,但也不会驱赶已经调度到当前Node的Pod。
PreferNoSchedule
该节点可以接收调度,但尽可能的会将Pod调度到其它节点,如果其它节点无法被调度后,依旧也可以调度到当前节点
2.给node打标签和删除标签
###打标签
kubectl label node k8s-master school= ###可以不给标签设定值
kubectl label node k8s-node class=sfy ###也可以设定值
###删除标签
kubectl label node k8s-master school-
kubectl label node k8s-node class-
温馨提示:
只要在KEY的名称后面加一个"-"就可以删除该标签!
3.添加污点和删除污点
###添加污点
(1)先对节点打标签
kubectl label node k8s-master school=
(2)添加污点
kubectl taint node k8s-master school=NoSchedule
(3)查看污点
kubectl describe node k8s-master | grep Taints
###删除污点
(1)删除污点
kubectl taint node k8s-master school-
(2)查看污点是否被成功删除
kubectl describe node k8s-master | grep Taints
2.为Pod资源添加容忍度
###为node打标签
[root@k8s-master ~]# kubectl label nodes k8s-master sfy=sfy
###为node打上污点
kubectl taint node k8s-master sfy=sfy:NoSchedule
### Pod配置容忍度
[root@k8s-master ~]# cat k8s_deployment1.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
tolerations: ###配置容忍度
- key: "sfy" ###键名为sfy
# operator: "Exists"
value: "sfy" ###键值为sfy
effect: "NoExecute" ###容忍的污点类型
containers:
- name: nginx
image: nginx:1.13
ports:
- containerPort: 80
resources: ###资源
limits: ###资源限制
cpu: 100m
memory: 10M
requests: ###资源需求
cpu: 100m
memory: 10M
ps:当node节点有多个污点的时候,pod容忍的应当把所有污点都写进yanl文件里,否则依然无法在污点节点创建pod
也可以通过nodename和nodeslector来指定pod创建节点,但是如果打了污点也必须在yaml文件中配置容忍度
3. Secret资源
1.Secret概述
与ConfigMap类似,区别在于Secret主要存储敏感数据,所有的数据要经过base64编码。但对于程序员而言,这依旧是明文数据,只不过想要拿到明文数据需要只需使用base64进行解码即可。
如下,基于base64进行编码和解码只需一行命令就搞定了。
[root@k8s-master ~]# echo -n "sfy" | base64
c2Z5
[root@k8s-master ~]# echo -n "c2Z5" | base64 -d
sfy
应用场景:
多用于存储凭据信息。
"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/
温馨提示:对于"kubernetes.io/service-account-token"这种类型是kubernetes预留的
[root@k8s-master ~]# kubectl get secret
NAME TYPE DATA AGE
default-token-z2bqv kubernetes.io/service-account-token 3 20h
2.secret简单应用作为容器环境变量
将用户名和密码进行base64编码
[root@k8s-master ~]# echo -n "admin" | base64
YWRtaW4=
[root@k8s-master ~]# echo -n "sunfuyang" | base64
c3VuZnV5YW5n
创建"Secret"资源
[root@k8s-master ~]# cat secret-demo.yaml
apiVersion: v1
kind: Secret
metadata:
name: db-user-pass
type: Opaque # 此处我们指定Secret资源的类型为"Opaque",通常用于存储密码,密钥等.
data:
# 将编码后的值放到Secret资源的配置文件中
username: YWRtaW4=
password: c3VuZnV5YW5n
[root@k8s-master ~]# kubectl apply -f secret-demo.yaml
将Secret的数据定义为容器的环境变量
##第一种写法
[root@k8s-master ~]# cat secret-pod-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: db-secret-demo
spec:
containers:
- name: demo
image: nginx:1.13
env:
- name: NAUS ###指定变量名字
valueFrom: ###指定变量来源
secretKeyRef: ###变量来源为secretkeyref
name: db-user-pass ###secret的名字
key: password ###secret中的键名称
[root@k8s-master ~]# kubectl apply -f secret-pod-demo.yaml

第二种写法更简单
[root@k8s-master ~]# cat secret-pod-demo2.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-test-pod
spec:
containers:
- name: test-container
image: nginx:1.13
envFrom: ###变量来源
- secretRef: ###指定变量来源为secret
name: db-user-pass ###指定secret的名字
env:
- name: USE
value: test

3.secret存储容器镜像仓库拉取的账号密码
创建secret资源
###基于命令行创建
kubectl create secret docker-registry harbor-secret --namespace=default --docker-username=admin --docker-password=a123456 --docker-server=blog.sfy.com
###基于yaml文件创建
将用户名和密码进行base64编码
[root@k8s-master ~]# echo '{"auths":{"hub.com":{"username":"20","password":"Y2"}}}'|base64
[root@k8s-master ~]# cat harbor-secret.yaml
apiVersion: v1
data:
.dockerconfigjson: eyJhdXRocyI ###上面编码的内容
kind: Secret
metadata:
name: harbor-secret
namespace: default
type: kubernetes.io/dockerconfigjson
方法一、基于sa资源引用镜像仓库的secret
###创建sa资源引用secret
[root@k8s-master ~]# cat k8s_sa_harbor.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: docker-image
namespace: default
imagePullSecrets:
- name: harbor-secret
###创建pod资源引用sa资源
[root@k8s-master ~]# cat k8s_pod.yaml
iapiVersion: v1
kind: Pod
metadata:
name: static-pod
spec:
serviceAccount: docker-image
containers:
- name: nginx
image: 2195802440/nginx:1.13
ports:
- containerPort: 80
方法二、pod直接引用镜像仓库的secret
[root@k8s-master ~]# cat k8s_pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: static-pod
spec:
nodeName: 10.0.0.12
imagePullSecrets: ###镜像下载的secrets资源
- name: harbor-secret ###secret资源名称
containers:
- name: nginx
image: 2195802440/nginx:1.13
ports:
- containerPort: 80
4.当然secret也可以当成文件挂载到pod中
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
volumes:
- name: foo
secret:
secretName: mysecret
defaultMode: 0400
####默认是挂载到/etc/foo/路径下的
items: ###指定键
- key: username ###指定键名
path: sfy ###指定路径,容器中的路径为即/etc/foo/sfy
4.ConfigMap资源
1.ConfigMap概述
创建ConfigMap资源后,数据实际会存储在Kubernetes集群中的ETCD数据库,然后通过创建Pod时引入该数据。
应用场景:
应用程序配置。
ConfigMap支持两种数据类型:
(1)键值对;
(2)多行数据;
Pod使用ConfigMap数据有两种方式:
(1)变量注入;
(2)数据卷挂载;
推荐阅读:
https://kubernetes.io/zh/docs/concepts/configuration/configmap/
2.创建ConfigMap资源
apiVersion: v1
kind: ConfigMap
metadata:
name: game-demo
data:
# 类属性键;每一个键都映射到一个简单的值
password: "3"
username: "sfy"
# 类文件键
game-peizhiwenjian: |
enemy.types=aliens,monsters
player.maximum-lives=5
user-peizhiwenjian2: |
color.good=purple
color.bad=yellow
allow.textmode=true
3.创建pod引用ConfigMap资源
apiVersion: v1
kind: Pod
metadata:
name: configmap-demo-pod
spec:
containers:
- name: demo
image: alpine
command: ["sleep", "3600"]
env:
# 定义环境变量
- name: SFY # 定义变量名称
valueFrom: ###变量值来源
configMapKeyRef: ###指定为configmap
name: game-demo # ConfigMap的名字
key: password # 需要取的configmap的键
volumeMounts: ###将下面的volumes挂载到的路径
- name: config
mountPath: "/config"
readOnly: true
volumes:
# 你可以在 Pod 级别设置卷,然后将其挂载到 Pod 内的容器中
- name: config
configMap:
# 提供你想要挂载的 ConfigMap 的名字
name: game-demo
# 来自 ConfigMap 的一组键,将被创建为文件
items:
- key: "game.properties"
path: "game.properties"
- key: "user-interface.properties"
path: "user-interface.properties"
5.k8s的外部网络映射svc+endpoints
###创建endpoints资源
[root@k8s-master yingshe]# vi mysql_endpoint.yaml
iapiVersion: v1
kind: Endpoints
metadata:
name: mysql
subsets:
- addresses:
- ip: 10.0.0.12
ports:
- name: mysql
port: 3306
protocol: TCP
###创建svc资源,svc是根据名字绑定endpoints的
[root@k8s-master yingshe]# vi mysql_svc_v2.yaml
iapiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- name: mysql
port: 3306
protocol: TCP
targetPort: 3306
type: ClusterIP
4.k8s-proxy的lvs模式
1.如果是kubeadmin部署的
###修改configmaps参数
[root@k8s-master ~]# kubectl edit configmaps -n kube-system kube-proxy
mode参数修改如下图:

###通过日志发现使用的依然是iptables规则

###安装ipvs服务并加载内核参数
[root@k8s-node01 ~]# yum install conntrack-tools -y
[root@k8s-node01 ~]# yum install ipvsadm.x86_64 -y
[root@k8s-master ~]# yum install conntrack-tools -y
[root@k8s-master ~]# yum install ipvsadm.x86_64 -y
[root@k8s-master ~]# modprobe ip_vs_sh
[root@k8s-master ~]# modprobe ip_vs
[root@k8s-master ~]# modprobe ip_vs_rr
[root@k8s-master ~]# modprobe ip_vs_wrr
[root@k8s-node01 ~]# modprobe ip_vs_sh
[root@k8s-node01 ~]# modprobe ip_vs
[root@k8s-node01 ~]# modprobe ip_vs_rr
[root@k8s-node01 ~]# modprobe ip_vs_wrr
###删除pod
[root@k8s-master ~]# kubectl delete pod -n kube-system kube-proxy-555dv
[root@k8s-master ~]# kubectl delete pod -n kube-system kube-proxy-ztsmv
###查看新pod日志

2.如果是二进制部署或者yum部署的
#修改启动参数添加--proxy-mode ipvs
vim /usr/lib/systemd/system/kube-proxy.service
[Unit]
Description=Kubernetes Proxy
After=network.target
[Service]
ExecStart=/usr/bin/kube-proxy \
······
--proxy-mode ipvs \
--logtostderr=false \
--v=2
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl restart kube-proxy.service
ipvsadm -L -n
未经允许不得转载:孙某某的运维之路 » 9.k8s常用资源补充内容
评论已关闭