一:pod-demo.yml
apiVersion: v1 # <string>
kind: Pod # <string>
metadata: # <Object>对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
name: pod-demo
namespace: default
#namespace: myapp-ns
labels: # <map[string]string> 映射数据不能加- 不是列表
app: myapp
tier: frontend
spec: # <Object>
containers: # <[]Object> 对象列表用-引导 对象数组 数组用-引导
- name: myapp
image: ikubernetes/myapp:v1
ports: #<[]Object>
- name: http # <string>
containerPort: 80 #<integer>
- name: https
containerPort: 443
- name: busybox
image: busybox:latest
command: # 列表 <[]string> #替换docker中的entrypoint。
- "/bin/sh"
- "-c"
- "sleep 3600"
二:端口 port
kubectl edit svc myapp-svc
type:NodePort
80:30636/TCP
ports:
- nodePort: 32000 #pod 端口 不定义为随机。
port: 800 #集群内访问端口。svc内部端口
protocol: TCP
targetPort: 80 #容器端口
selector:
run: nginx-pod
sessionAffinity: None
type: NodePort #ClusterPort
三:标签labels: key=value
kubectl get pods -l app #显示拥有app标签的Pod
kubectl get pods -l run=client
kubectl label pods client release=canary #增加标签
kubectl label pods client release=stable --overwrite #强行修改标签
四:标签选择器
等值关系:
kubectl get pods --show-labels -l release=canary
kubectl get pods --show-labels -l release=stable,run
集合关系:in
KEY in (VALUE1,VALUE2,VALUE3)
kubectl get pods --show-labels -l “release in (canary,beta)”
KEY notin (VALUE1,VALUE2,VALUE3)
kubectl get pods --show-labels -l “release notin (canary,beta)”
选择器
matchLabels: 直接给定键值
matchExpressions: 基于给定的表达式来定义标签选择器{key:“KEY”,“OPERATOR”,values:[VAL1,VALU2,…]}
OPERATOR: In, NotIn, values字段值必须为非空列表
Exists, NotExists values字段必须为空列表
nodeSelector <map[string]string>
annotations: 资源注解。区别与lables在于 不能挑选资源对象。仅用于为对象提供元数据。
五: pod的生命周期 liveness probe /rediness probe差别。
post start --------> run -------->pre stop
main container----------------------------------------
post start ---->liveness probe /rediness probe------>pre stop
livense probe # 存活状态检测
rediness probe # 就绪状态检测 判定进程否提供服务 目标不同。 1/1 0/1
1. ExecAction 自定义命令
2. TCPSocketAction 端口命令 tcp端口发命令
3. HTTPGet http 服务请求 应用层get请求。
pod状态:pending 挂起 。条件不满足。调度未完成。
running 运行状态
Failed,........suceesed Unknow
创建pod: etcd -----
容器重启策略:
Aways :pod中的容器挂了直接重启
OnFailure : 重启策略
Never: 从不重启
Default: Aways
pod结束时 会向Pod所有的容器发送stop信号。宽限期。30s。过后重新发送强行这终止信号。
exec-demo.yml
apiVersion: v1
kind: Pod
metadata:
name: liveness-exec-pod
spec:
containers:
- name: liveness-exec-container
image: busybox:latest
command:
- "/bin/sh"
- "-c"
- "touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy;sleep 3600"
livenessProbe: #
exec:
command:
- "test"
- "-e"
- "/tmp/healthy"
initialDelaySeconds: 2 # 第一次探测延时时间 2秒 。
periodSeconds: 5 # 第二次探测间隔的时间 5秒
livenss-httpget.yaml
apiVersion: v1
kind: Pod
metadata:
name: liveness-httpget-pod
spec:
containers:
- name: liveness-httpget-container
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
livenessProbe:
httpGet:
port: http
path: /index.html
initialDelaySeconds: 2 # 第一次探测延时时间 2秒 。
periodSeconds: 5 # 第二次探测间隔的时间 5秒
六:lifecycle 启动后钩子 终止前钩子
postStart #启动后执行
preStop #结束前执行
exec
httpGet
tcpSocket
poststart-demo.yml
apiVersion: v1
kind: Pod
metadata:
name: poststart-pod
spec:
containers:
- name: busybox-httpd
image: busybox:latest
imagePullPolicy: IfNotPresent
lifecycle:
postStart: #
exec:
command:
- "/bin/sh"
- "-c"
- "mkdir -p /data/web/; echo 'homepate' >> /data/web/html.index" # 首先执行
command: # 不能强依赖postStart的结果。 两条命令不能相互依赖结果 无法确定哪个先执行
- "/bin/sh"
- "-c"
- "sleep 3600"
八:pod控制器。
1.ReplicaSet () ReplicationController
-
Deployment: 工作与ReplicaSet之上的。 扩缩容。
-
DaemonSet : 确定每个节点运行一个。 后台守护进程。系统级应用。 支持滚动更新。
-
Job : 任务是否完成。只能执行一次性作业。
-
Cronjob:
-
StatefulSet : 有状态应用。
1.rs.yml
apiVersion: apps/v1 kind: ReplicaSet metadata: name: myapp spec: replicas: 2 selector: matchLabels: # 匹配Pod标签 app: myapp release: canary template: metadata: name: myapp-pod # pod名称。无用。可不定义。 labels: # pod标签 app: myapp release: canary environment: qa spec: containers: - name: myapp-container image: ikubernetes/myapp:v1 ports: - name: http containerPort: 80 strategy: #更新策略 金丝雀发布 。 rollingUpdate: maxSurge: 1 # 最大只能多1个。 maxUnavailable: 0 # 可以有几个不可用。0个
service与pod控制器无关。lables取决于pod标签。
Deployment更新策略;
canary版本 金丝雀
kubectl set image deployment myapp-deploy myapp=ikubernetes/myapp:v2 && kubectl rollout pause deployment myapp-deploy #更新1个后暂停更新
kubectl rollout status deployment myapp-deploy #查看滚动了几个
kubectl rollout resume deployment myapp-deploy #继续上一次的滚动更新。
kubectl rollout history deployment myapp-deploy
kubectl rollout undo deployment myapp-deploy --to-revision=5
deploy-myapp.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
spec:
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
replicas: 5
selector:
matchLabels:
app: myapp
release: canary
template:
metadata:
labels:
app: myapp
release: canary
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v2
ports:
- name: http
containerPort: 80
redis-deployment.yml
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
filebeat-daemonset.yml
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
- name: REDIS_LOG_LEVEL
value: info
kubectl explain pods.spec.hostNetwork #共享宿主机的网络空间。
九、Service
iptables -vnL -t nat
ClusterIP
NodePort
LoadBalancer 云环境
资源记录:SVC_NAME.NS_NAME.DOMAIN.LTD
redis.default.svc.cluster.local
redis-svc.yml
apiVersion: v1
kind: Service
metadata:
name: redis
spec:
clusterIP: 10.97.97.97
type: ClusterIP
ports:
- port: 6369
targetPort: 6379
selector:
app: redis
role: logstor
ports:
- nodePort: 32000 #pod 端口 不定义为随机。 尽量不要指定
port: 800 #集群内访问端口。svc内部端口
protocol: TCP
targetPort: 80 #容器端口 目标端口 必须指定
selector:
run: nginx-pod
sessionAffinity: None
type: NodePort #ClusterPort
$$
ports:
- nodePort: 32000 #pod 端口 不定义为随机。
port: 800 #集群内访问端口。svc内部端口
protocol: TCP
targetPort: 80 #容器端口
selector:
run: nginx-pod
sessionAffinity: None
type: NodePort #ClusterPort
$$
spec:sessionAffinity:ClientIP 连接追踪
无头服务:clusterIP: None . 不能是Nodeport
dig -t A redis.default.svc.cluster.local. @10.96.0.10
apiVersion: v1
kind: Service
metadata:
name: app-myapp
spec:
type: ClusterIP
clusterIP: "None" #无头服务
ports:
- port: 80
targetPort: 80
selector:
app: myapp
release: canary