Pod控制器类型:
ReplicationController à Replicaset
Replicaset:维持用户期望的pod副本数 标签选择器:以便选定由自己选定管理的pod副本 pod资源模板:完成pod资源的新建
特点:管理无状态的pod资源,精确反映用户所定义的目标数量
K8s不建议直接使用Replicaset,而是使用Deployment
Deployment:工作在replicaset上,通过控制replicaset来控制pod
Deployment具备replicaset功能,还具有滚动更新,回滚,等更多强大机制,还提供声明式配置功能,管理群体,而不关注单个节点
DaemSet:确保集群中的每一个node只运行一个特定的pod副本,实现系统级的后台任务,也具有标签选择器,也可以指定部分满足条件的node运行一个pod副本,比如监控具有ssd存储的node节点
以上共同的特点:pod服务无状态,pod服务必须是守护进程类的,
Job:一次性作业,任务完成,pod退出
Cronjob:周期性运行,每一次完成,pod退出
Statefulset:管理有状态的运用pod,每一个pod运用,每一个pod副本,都是单独管理,
备注:
TPR: third party resource, 1.2 ~ 1.7版本 支持第三方资源
CDR: custom defined resource , 1.8+版本 支持自定义资源
Operator
Helm:
Pod控制详解:
ReplicaSet
kubectl explain replicaset
kubectl explain rs
spec控制器规格
kubectl explain rs.spec
模板 既pod模板
kubectl explain rs.spec.template
模板规格 pod模板规格
kubectl explain rs.spec.template.spec
实例:定义一个replicaset控制器
vim replicaset-demo.yaml
apiVersion: apps/v1 控制器版本
kind: ReplicaSet 类型
metadata: 控制器元数据
name: myapp 控制器name 也是创建的pod的名称
namespace: default 控制器名称空间
spec: 控制器规格
replicas: 2 创建2个副本
selector: 控制器选择器
matchLabels: 匹配
app: myapp 选择的pod标签
release: canary
template: pod模板
metadata: pod模板元数据
name: myapp-pod pod模板的pod名,实际使用选择器的name
labels: pod模板的pod标签
app: myapp pod模板pod标签名
release: canary
environment: qa
spec: pod模板的pod的spec
containers:
- name: myapp-container
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
创建replicaset选择器和pod
kubectl create -f replicaset-demo.yaml
查询验证
kubectl get rs 查询replicaset控制器类下的控制器
kubectl get replicaset
kubectl get pods
kubectl describe pod myapp-r65th
验证创建的replicaset控制器
kubectl delete pods myapp-r65th 删除一个pod,replicaset控制器会重新创建一个pod,以维持2个pod
kubectl get pods
如果pod数量大于2个
kubectl get pods --show-labels
kubectl create -f pod-demo.yaml
kubectl label pods pod-demo release=canary 这种情况pod的label标签和 myapp的一样,控制器replicaset会认为是和myapp同类型的pod,那么就会随机终止并删一个这样的pod以维持2个副本
kubectl get pods --show-labels
动态扩容:
kubectl edit rs myapp
kubectl edit replicaset myapp
修改replicas: 的值即可
动态升级:
kubectl edit rs myapp
kubectl edit replicaset myapp
kubectl edit 控制器类型 控制器名
修改- image:ikubernetes/myapp:v2即可
查询版本验证
kubectl get rs -o wide
注:只是升级镜像,容器升级需要重新建
kubectl delete pod myapp-k2kqx
重新创建的pod就用升级版本了
kubectl delete rs myapp 删除replicaset类下的myapp控制器和pod
Deploy
基于在replicaset之上的更新逻辑,更新策略
kubectl explain deploy
kubectl explain deploy.spec 与replicaset相近
revisionHistoryLimit <integer> 保留多少个历史版本 既保留多少个上个版本
kubectl explain deploy.spec.strategy 更新策略
kubectl explain deploy.spec.strategy.rollingUpdate 滚动更新
kubectl explain deploy.spec.template 创建pod模板
实例:
vim deploy-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: myapp
release: canary
template:
metadata:
labels:
app: myapp
release: canary
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
kubectl apply -f deploy-demo.yaml apply:声明式创建,即可以创建,也可以更新
kubectl get deploy
kubectl get pods -o wide
kubectl get rs 同时也创建了replicaset控制器
deploy更新运用
vim deploy-demo.yaml
修改:replicas: 3
重新声明,即可以修改完成
kubectl apply -f deploy-demo.yaml
kubectl get pods
kubectl describe deploy myapp 查看deploy下的myapp控制器详细描述信息默认rollingupdate 滚动更新
滚动更新
kubectl get pods -l app=myapp –w 监控滚动更新
vim deploy-demo.yaml
修改image: ikubernetes/myapp:v2
kubectl apply -f deploy-demo.yaml 就可以看到滚动更新,默认25%
kubectl get rs -o wide 可以看到创建了新的replicaset,旧的replicaset保留用于回滚
kubectl rollout history deploy myapp-deploy 查看滚动历史
打补丁扩容
kubectl patch --help
kubectl patch deployment myapp-deploy -p '{"spec":{"replicas":5}}'
控制器类 控制器名 参数 yaml文件下对应
kubectl get pods 验证
pause更新几个之后暂停更新
kubectl explain deploy.spec.strategy.rollingUpdate
kubectl patch deploy myapp-deploy -p
'{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1,"maxUnavailable":0}}}}'
滚动 最多多余几个可用 最少少于几个不可用
kubectl describe deploy my-app 查看补丁结果
启动更新版本
kubectl set image –help
kubectl get pods -l app=myapp –w 先监控
kubectl set image deployment myapp-deploy myapp=ikubernetes/myapp:v3 && kubectl
rollout pause deploy myapp-deploy
终止更新
kubectl rollout resume deployment myapp-deploy 继续更新
另一种监控方式
kubectl rollout status deploy myapp-deploy
kubectl get rs -o wide 将会看到3个replicaset版本
回滚
kubectl rollout --help
kubectl rollout history deploy myapp-deploy 查看滚动的版本历史
kubectl rollout undo deploy myapp-deploy --to-revision=1
回滚到版本1
kubectl rollout history deploy myapp-deploy 回滚之后版本1变成版本4
kubectl get rs -o wide 此时工作的replicaset 的是v1
daemonset
在整个集群的每一个节点上只运行一个指定的pod,或在指定的节点上运行一个pod,,实现系统级的管理功能,可以把节点上的某个目录作为一个存储卷,关联至pod中,让pod实现某些管理功能,支持滚动更新
kubectl explain ds
kubectl explain daemonset
kubectl explain daemonset.spec
kubectl explain pods.spec.containers 查询env容器环境变量
kubectl explain pods.spec.containers.env
实例
cp deploy-demo.yaml ds-demo.yaml
vim ds-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: redis
role: logstor
template:
metadata:
labels:
app: redis
role: logstor
spec:
containers:
- name: redis
image: redis:4.0-alpine
ports:
- name: redis
containerPort: 6379
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: filebeat-ds
namespace: default
spec:
selector:
matchLabels:
app: filebeat
release: stable
template:
metadata:
labels:
app: filebeat
release: stable
spec:
containers:
- name: filebeat
image: ikubernetes/filebeat:5.6.5-alpine
env:
- name: REDIS_HOST
value: redis.default.svc.cluster.local #如果获取不到域名,就填redis的实际IP
- name: REDIS_LOG_LEVEL
value: info
kubectl apply -f ds-demo.yaml 创建pod
kubectl get pods 查询
kubectl logs myapp-ds-w6dhg 查询日志
创建服务
kubectl expose deploy redis --port=6379
服务名 暴露端口
kubectl get service 查询服务
kubectl exec -it redis-5c998b644f-zv7nj -- /bin/sh 验证redis发日志
# netstat –ntl
# nslookup redis.default.svc.cluster.local 解析地址
解析不到就用实际IP
kubectl get pods -o wide 找到redis pod 的ip 10.244.1.25
# redis-cli -h 10.244.1.25 进入redis
# > keys * 没有日志
# printenv 打印环境变量
#kill -1 重载配置文件 重载信号
kubectl exec -it filebeat-ds-ztj2h -- /bin/sh 进入filebeat查看filebeat服务是否启动
# ps aux 进程存在,说明服务已经启动
修改redis地址: - name: REDIS_HOST
value: 10.244.1.25
kubectl apply -f ds-demo.yaml
kubectl apply -f /tmp/kubectl-edit-t7h63.yaml 再次引用
注:kill -1 重载配置文件 重载信号
滚动更新
kubectl explain daemonset.spec.updateStrategy
kubectl explain daemonset.spec.updateStrategy.rollingUpdate
查看是否有默认滚动更新
kubectl describe ds filebeat
执行滚动更新
kubectl get pods -o wide -l app=filebeat –w 先监控
kubectl set image –help
kubectl set image daemonsets filebeat-ds filebeat=ikubernetes/filebeat:5.6.6-alpine
控制器类 控制器名 容器名=镜像名
注:
容器可以共享使用宿主机的网络名称空间,那么容器中监听的端口就是监听在宿主机上了,也就是外面网络可以直接访问容器了,(hostNetwork状态必须为true,默认是false)
kubectl explain pods.spec.hostNetwork
来源:https://www.cnblogs.com/leiwenbin627/p/11296275.html