k8s day04
昨日内容回顾:
- configMap ---> cm
应用场景: 主要用于配置文件的持久化。
- secret
应用场景: 存储敏感数据,并非加密数据。
- pod探针(probe):
- livenessProbe:
健康检查探针,若检查失败,则会重启容器(重新创建容器)。
值得注意的是,若手动去使用docker去kill容器,是否会重启取决于重启策略,注意,尽管重新拉起容器会计数重启次数。
- readinessProbe
可用性检查探针,若检查失败,则将容器标记为未就绪状态,与此同时,对于svc的ep资源列表不会自动发现;
- env获取cm或者secret资源的值
Q1: 请问Pod导入secret资源有几种方式?
- env
- volume
Q2: 请问cm资源有几种定义方式?
- 单行模式,
KEY: VALUE
- 多行模式,类文件模式
KEY : |
...
...
...
Q3: 外网访问K8S集群的Pod有多少种方式?
- hostNetwork
- hostPort ---> 1.5.2有效! 1.15.12则无效!【了解即可】
- Svc
- Ing
- ApiServer
Q4: 影响Pod调度的方式有哪些?
- nodeName
- resources
- 污点
- 污点容忍
- 亲和性
- 反亲和性
- 自定义调度器
- 工作负载调度器 ---> ds,deploy
...
kubectl version :
查看K8S的版本号。
GitVersion:"v1.5.2",
BuildDate:"2017-07-03T15:31:10Z"
GitVersion:"v1.15.12",
BuildDate:"2020-05-06T05:09:48Z"
[root@k8s151.oldboyedu.com po]# cat 22-pods-ports.yaml
kind: Pod
apiVersion: v1
metadata:
name: oldboyedu-linux82-ports-001
spec:
nodeName: k8s152.oldboyedu.com
containers:
- name: linux82-web
image: k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.20.1
# 定义容器的端口映射相关信息
ports:
# 容器内服务监听的端口
- containerPort: 80
# 指定绑定的宿主机IP地址
hostIP: 0.0.0.0
# 指定宿主机的端口
hostPort: 18888
# 给映射的端口起名字,要求唯一
name: myweb
# 指定协议,有效值为: UDP, TCP, or SCTP.
protocol: TCP
[root@k8s151.oldboyedu.com po]#
容器的三种类型:
网络基础镜像容器:
pause:v3.1
---> 提供网络基础的。
初始化容器:
initContainers
---> 为业务容器提供基础环境准备的。
业务容器:
containers
---> 跑实际业务。
初始化容器参考案例:
[root@k8s151.oldboyedu.com po]# cat 23-pods-initContainers.yaml
---
apiVersion: v1
data:
.dockerconfigjson: eyJhdXRocyI6eyIxMC4wLjAuMjUwIjp7InVzZXJuYW1lIjoiamFzb255aW4yMDIwIiwicGFzc3dvcmQiOiJPbGRib3llZHVAMjAyMiIsImVtYWlsIjoiamFzb255aW5Ab2xkYm95ZWR1LmNvbSIsImF1dGgiOiJhbUZ6YjI1NWFXNHlNREl3T2s5c1pHSnZlV1ZrZFVBeU1ESXkifX19
kind: Secret
metadata:
name: oldboyedu-harbor
type: kubernetes.io/dockerconfigjson
---
kind: Pod
apiVersion: v1
metadata:
name: oldboyedu-linux82-initcontianer-002
spec:
nodeName: k8s152.oldboyedu.com
imagePullSecrets:
- name: oldboyedu-harbor
# 初始化容器,为业务容器提供基础环境准备的。
initContainers:
- name: init-web
image: 10.0.0.250/oldboyedu-linux/stress:v0.1
command:
- sleep
- "30"
# 我们可以将containers理解为业务容器。初始化容器要先于业务容器运行。
containers:
- name: linux82-web
image: k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.20.1
# 定义容器的端口映射相关信息
ports:
# 容器内服务监听的端口
- containerPort: 80
# 指定绑定的宿主机IP地址
hostIP: 0.0.0.0
# 指定宿主机的端口,k8s1.5.2会监听端口,K8S1.15.12不会监听端口但能访问哟!
hostPort: 28888
# 给映射的端口起名字,要求唯一
name: myweb
# 指定协议,有效值为: UDP, TCP, or SCTP.
protocol: TCP
[root@k8s151.oldboyedu.com po]#
静态Pod:
vim /var/lib/kubelet/config.yaml
...
staticPodPath: /etc/kubernetes/manifests
温馨提示:
(1)静态Pod是由kubelet启动时通过"staticPodPath"配置参数指定路径
(2)静态Pod创建的Pod名称会自动加上kubelet节点的主机名,比如"-k8s151.oldboyedu.com",会忽略"nodeName"字段哟;
(3)静态Pod的创建并不依赖API-Server,而是直接基于kubelet所在节点来启动Pod;
(4)静态Pod的删除只需要将其从staticPodPath指定的路径移除即可;
(5)静态Pod路径仅对Pod资源类型有效,其他类型资源将不被创建哟
(6)咱们的kubeadm部署方式就是基于静态Pod部署的哟;
rc简介:
replicationcontrollers控制器简称"rc",可以保证指定数量的Pod始终存活,rc通过标签选择器来关联Pod。
[root@k8s151.oldboyedu.com rc]# cat 01-rc-nginx.yaml
kind: ReplicationController
apiVersion: v1
metadata:
name: oldboyedu-linux82-rc-web
spec:
# 指定Pod的副本数量,若不指定,则默认值为1.
replicas: 3
# 定义标签选择器,即用于关联Pod的标签。
selector:
school: oldboyedu
# 定义Pod的模板
template:
metadata:
name: linux82-web
labels:
school: oldboyedu
class: linux82
spec:
# nodeName: k8s152.oldboyedu.com
containers:
- name: linux82-web
image: k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.20.1
[root@k8s151.oldboyedu.com rc]#
创建RS资源用于测试svc:
[root@k8s151.oldboyedu.com rs]# cat 01-rs-nginx.yaml
kind: ReplicaSet
apiVersion: extensions/v1beta1
metadata:
name: oldboyedu-linux82-rs-web
spec:
# 指定Pod的副本数量,若不指定,则默认值为1.
replicas: 3
# 定义标签选择器,即用于关联Pod的标签。
selector:
# 相比于rc资源,rs资源支持的功能更加强大,不仅仅支持标签选择器,还支持表达式(matchExpressions)
matchLabels:
school: oldboyedu
# 定义Pod的模板
template:
metadata:
name: linux82-web
labels:
school: oldboyedu
class: linux82
spec:
# nodeName: k8s152.oldboyedu.com
containers:
- name: linux82-web
image: k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.20.1
livenessProbe:
tcpSocket:
port: 80
failureThreshold: 3
initialDelaySeconds: 15
periodSeconds: 1
successThreshold: 1
timeoutSeconds: 1
readinessProbe:
httpGet:
port: 80
path: /oldboyedu.html
failureThreshold: 3
initialDelaySeconds: 15
periodSeconds: 1
successThreshold: 1
timeoutSeconds: 1
[root@k8s151.oldboyedu.com rs]#
创建svc资源:
[root@k8s151.oldboyedu.com rs]# cat ../svc/01-svc-nginx.yaml
apiVersion: v1
kind: Service
metadata:
name: linux82-svc-web
spec:
# 映射Pod端口信息
ports:
# 指定SVC的端口
- port: 9999
# 指定Pod提供服务的端口
targetPort: 80
# 指定标签,用于匹配关联的POD
selector:
class: linux82
[root@k8s151.oldboyedu.com rs]#
查看所有的svc:
kubectl get svc
查看指定svc的详细信息:
kubectl describe svc linux82-svc-web
rc资源有两大缺陷:
(1)不支持声明式更新镜像;
(2)升级的时候有时候需要运维人员介入解决svc无法自动关联Pod的现象;
为了避免这种现象发生,将rc资源的selector和svc的selector定义成不一样的关联即可。见视频。
基于rc升级和回滚:
1.创建原始版本
kubectl apply -f 01-rc-svc.yaml -f 02-rc-nginx-old.yaml
2.测试访问服务
curl -I 10.0.0.53:30088
3.升级
kubectl rolling-update oldboyedu-linux82-rc-web-old -f 03-rc-nginx-update-new.yaml --update-period=1s
oldboyedu-linux82-rc-web-old:
表示现有的rc名称。
-f 03-rc-nginx-update-new.yaml
基于哪个文件升级或回滚。
--update-period=1s
升级的间隔时间。
4.升级后运行需要解决用户无法访问Pod的情况
方案一:
使用旧的svc,即给新的pod打标签。
kubectl label pods --all class=linux82
# kubectl label pods --all class- # 删除标签
方案二:
使用新的svc。
kubectl delete -f 01-rc-svc.yaml
kubectl apply -f 04-rc-svc-new.yaml
5.回滚
kubectl rolling-update oldboyedu-linux82-rc-web-new -f 02-rc-nginx-old.yaml --update-period=1s
kubectl delete -f 04-rc-svc-new.yaml
kubectl apply -f 01-rc-svc.yaml
资源清单:
[root@k8s151.oldboyedu.com test]# cat 01-rc-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: linux82-svc-web-nodeport-002
spec:
type: NodePort
ports:
- port: 9999
targetPort: 80
nodePort: 30088
selector:
class: linux82
[root@k8s151.oldboyedu.com test]#
[root@k8s151.oldboyedu.com test]# cat 02-rc-nginx-old.yaml
kind: ReplicationController
apiVersion: v1
metadata:
name: oldboyedu-linux82-rc-web-old
spec:
# 指定Pod的副本数量,若不指定,则默认值为1.
replicas: 3
# 定义标签选择器,即用于关联Pod的标签。
selector:
school: oldboyedu
# 定义Pod的模板
template:
metadata:
name: linux82-web
labels:
school: oldboyedu
class: linux82
spec:
# nodeName: k8s152.oldboyedu.com
containers:
- name: linux82-web
image: k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.14
[root@k8s151.oldboyedu.com test]#
[root@k8s151.oldboyedu.com test]# cat 03-rc-nginx-update-new.yaml
kind: ReplicationController
apiVersion: v1
metadata:
name: oldboyedu-linux82-rc-web-new
spec:
replicas: 3
selector:
school: oldboyedu-new
template:
metadata:
name: linux82-web
labels:
school: oldboyedu-new
address: beijing-linux82
spec:
containers:
- name: linux82-web
image: k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.16
[root@k8s151.oldboyedu.com test]#
[root@k8s151.oldboyedu.com test]# cat 04-rc-svc-new.yaml
apiVersion: v1
kind: Service
metadata:
name: linux82-svc-web-nodeport-002-new
spec:
type: NodePort
ports:
- port: 9999
targetPort: 80
nodePort: 30088
selector:
school: oldboyedu-new
address: beijing-linux82
[root@k8s151.oldboyedu.com test]#
deoloyment资源控制器: ---> 声明式更新
[root@k8s151.oldboyedu.com deploy]# cat 01-deploy-nginx.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: oldboyedu-linux82-deploy-nginx
spec:
replicas: 3
selector:
matchLabels:
school: oldboyedu
template:
metadata:
name: linux82-web
labels:
school: oldboyedu
class: linux82
spec:
containers:
- name: linux82-web
# image: k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.20.1
image: k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.18
livenessProbe:
tcpSocket:
port: 80
failureThreshold: 3
initialDelaySeconds: 15
periodSeconds: 1
successThreshold: 1
timeoutSeconds: 1
# readinessProbe:
# httpGet:
# port: 80
# path: /oldboyedu.html
# failureThreshold: 3
# initialDelaySeconds: 15
# periodSeconds: 1
# successThreshold: 1
# timeoutSeconds: 1
---
apiVersion: v1
kind: Service
metadata:
name: linux82-svc-web-nodeport-002
spec:
type: NodePort
clusterIP: 10.254.100.100
ports:
- port: 9999
targetPort: 80
nodePort: 30088
selector:
class: linux82
[root@k8s151.oldboyedu.com deploy]#
响应式更新:
kubectl set image deploy oldboyedu-linux82-deploy-nginx linux82-web=k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.16
kubectl set image 资源类型 资源类型名称 容器名称=镜像名称
基于edit编辑:
kubectl edit deployments. oldboyedu-linux82-deploy-nginx
副本数量
old : 5
new : 5
附加条件:
old ---> new :
- 5 + 2 ---> 7 升级过程中最大的pod
- 5 - 1 ---> 4 最少保证4个可用。
升级需要几次?请说明原因:
第一次升级:
old : 3 5 4 5 2 ---> 4
new : 2 2 2 2 3 ---> 3
第二次升级:
old: 3 0 4 2 1 3 6 ---> 1
new: 4 7 2 5 6 4 4 ---> 3 + 2 ---> 5
...
replicas: 8
maxSurge: 5
maxUnavailable: 3
---->
第一次升级
old : 5
new : 8
replicas: 7
maxSurge: 2
---> max ---> 9
maxUnavailable: 3
---> min ---> 4
第一次升级:
old: 4
new: 5
第二次升级:
old: 0
new: 5 + 2 --> 7
基于deployment升级:
[root@k8s151.oldboyedu.com deploy]# cat 02-deploy-nginx-update-strategy.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: oldboyedu-linux82-deploy-nginx-strategy
spec:
replicas: 5
selector:
matchLabels:
school: oldboyedu
# 定义升级策略
strategy:
# 升级的类型,"Recreate" or "RollingUpdate"
# Recreate:
# 先停止所有的Pod运行,然后在批量创建更新。
# 生产环节中不推荐使用这种策略,因为升级过程中用户将无法访问服务!
# RollingUpdate:
# 滚动更新,即先实现部分更新,逐步替换原有的pod,是默认策略。
type: RollingUpdate
# 自定义滚动更新的策略
rollingUpdate:
# 在原有Pod的副本基础上,多启动Pod的数量。
maxSurge: 2
# 在升级过程中最大不可访问的Pod数量.
maxUnavailable: 1
template:
metadata:
name: linux82-web
labels:
school: oldboyedu
class: linux82
spec:
containers:
- name: linux82-web
# image: k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.20.1
# image: k8s151.oldboyedu.com:5000/oldboyedu-web/nginx:1.18
image: nginx:1.14
livenessProbe:
tcpSocket:
port: 80
failureThreshold: 3
initialDelaySeconds: 15
periodSeconds: 1
successThreshold: 1
timeoutSeconds: 1
# readinessProbe:
# httpGet:
# port: 80
# path: /oldboyedu.html
# failureThreshold: 3
# initialDelaySeconds: 15
# periodSeconds: 1
# successThreshold: 1
# timeoutSeconds: 1
---
apiVersion: v1
kind: Service
metadata:
name: linux82-svc-web-nodeport-002
spec:
type: NodePort
clusterIP: 10.254.100.100
ports:
- port: 9999
targetPort: 80
nodePort: 30088
selector:
class: linux82
扩展作业:
(1)使用阿里云部署K8S集群,并将11个游戏将部署到云平台提供访问,要求使用svc的类型为LoadBalancer。
(2)使用kubeadm1.15或Kubeadm 1.19版本将其etcd数据库独立部署出来,不要使用内置的;
(3)调研K3S二进制部署,K3S是轻量级的K8S发行版;
(4)部署ranger管理K8S集群;
常见错误:
PodFitsHostPorts:
问题原因:
和Pod调度节点的端口有所冲突。
解决方案:
可能无法提供给"ss -ntl"来观察,需要借助"iptables -t nat -vnL"来观察哟。
Init:ErrImagePull
问题原因:
初始化容器拉取镜像失败。
解决方案:
一般情况下,请检查网络,权限等维度即可。