请求控制流程:
Pod >>ReplicaSet>>Deployment>>Service
APIServer: 发送指令
API-Scheduler: 调度服务
API-ControllerManager: 发送请求
Kubelet: 管理pod
Kube-proxy: 添加防火墙规则,服务发现
资源控制器类型:
Pod ,ReplicaSet ,Deployment ,Service ,DeamonSet ,StatefulState ,Job ,CronJob ,Label ,Label SeLector ,…
创建资源的方法:
APIServer 仅接受JSON格式的资源定义,yaml 提供配置清单,APIServer可以自动转化成JSON格式,而后再提交。
查看资源配置清单的格式的详细字段信息: kubectl explain 资源类型. …
大部分的资源配置清单:
apiVersion: GROUP/VERSION
kind: xxx //资源类型
metadate:
name: xxx //没有实际意义
namespace: xxxx //指定名称空间,默认是default
labels: //没有实际意义的标签
xxx: xxxx
…
annatations:
xxx: xxx //注释
spec: //期望状态。
…
status //(当前状态,不用定义)
常用的AD-HOC:
kubectl get pod pod_name 可以加–show-labels //查看标签 -L //匹配标签 -w //动态追踪pod情况 -l //精确匹配标签 …
kubectl get svc svc_name
kubectl get deployment deloy_name
kubectl get rs rs_name
kubectl run NAME --image=IMAGE_NAME --port= --replicas= key=value …
kubectl expose deloyment deploy_name --name svc_name --type= --port --targetPort= --protocol=
kubectl edit resource/name
kubectl scale deployment DELOY_NAME --replicas=
kubectl explain …
kubectl describe …
kubectl set image
kubectl rollout
kubectl rollout undo
1.POD的资源配置清单
apiVersion: v1 //api版本
kind: Pod //资源类型
metadata: //元数据
name: pod-demo //pod的名字
namespace: default //pod所属的名称空间
labels: //pod的标签
app: myapp
tier: frontend
annotations: //pod的注释
lizhilin.com/created-by: “cluster admin”
spec: //资源配置列表
containers: // 容器限制
- name: myspp //容器名称
image: ikubernetes/myapp:v1 //容器需要的镜像
ports: //容器暴露的端口- name: httpd //端口的名称
containerPort: 80 //端口 - name: https
containerPort: 443
- name: httpd //端口的名称
- name: busybox
image: busybox:latest
imagePullPolicy: IfNotPresent
command: //不运行镜像本身的命令,=docker的cmd- “/bin/sh”
- “-c”
- “sleep 5”
nodeSelector: //节点标签选择器
disktype: ssd
~
2.ReplicaSet的资源配置清单
apiVersion: apps/v1 //api版本:GROU/VERSION
kind: ReplicaSet //资源类型
metadata: //元数据
name: myapp //名称
namespace: default //所属名称空间
spec: //资源配置列表
replicas: 2 //开启副本数
selector: //对POD的标签选择
matchLabels: //标签选择的方法,还有matchExpressions(写列表),标签与标签是逻辑与的关系
app: myapp
release: canary
template: //pod模板
metadata: //pod元数据
name: myapp-pod
labels: //pod标签必须与selector一致,可以多,但是不能少
app: myapp
release: canary
environment: qa
spec: //pod的资源配置列表
containers:
- name: myapp-container
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
3.Deployment的资源配置清单
apiVersion: apps/v1 //api版本:GROU/VERSION
kind: Deployment //资源类型
metadata: //元数据
name: myapp-deploy
namespace: default
spec: //资源配置列表
replicas: 3 //开启副本数
selector: //pod标签选择器
matchLabels: //标签选择方法,,还有matchExpressions(写列表),标签与标签是逻辑与的关系
app: myapp
release: canary
template: //pod模板
metadata: //pod的元数据
labels:
app: myapp
release: canary
spec: //pod的资源配置列表
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
4.Liveness与Readiness
创建pod时的过程:
钩子
POD的生命状态:
Pending: 挂起,调度未完成
Running: 运行中
Failed: 失败
Successeded: 成功
UNknown: 未知状态
…
创建POD:
POD的生命周期的重要行为:
初始化容器
容器探测:
liveness: 容器存活探测
readiness: 容器准备状态探测
探针类型:
ExecAction、TCPSocketAction、HTTPGetAction
探测策略:
initialDelaySecond: 启动容器后第一次执行探针在多少秒后
periodSeconds: 执行探针的频率
timeoutSecond: 探测超时时间
successThreshod: 探测失败后,最少成功几次
failureThieshold: 探测成功后,最少连续失败几次被认定为失败
Liveness探测eg:
apiVersion: v1
kind: Pod
metadata:
name: liveness-exec-pod
namespace: default
spec:
containers:
- name: liveness-exec-container
image: busybox:latest
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c",“touch /tmp/healthy; sleep 30; rm -f /tmp/healthy ;sleep 3600 “]
livenessProbe:
exec:
command: [“test”,”-e”,"/tmp/healthy"] //这个cmd运行的优先级在spec的之后
initialDelaySeconds: 1
periodSeconds: 3
Readiness探测eg:
apiVersion: v1
kind: Pod
metadata:
name: readiness-httpget-pod
namespace: default
spec:
containers:
- name: readiness-httpget-container
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent //image拉取策略
ports:- name: http
containerPort: 80
readinessProbe:
httpGet: //探针类型
port: http
path: /index.html
initialDelaySeconds: 1
periodSeconds: 3
- name: http
5.DaemonSet的资源配置清单:
类似于deployment,支持滚动更新
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.cluster.svc.cluster.local
- name: REDIS_LOG_LEVEL
value: info
6.Service的资源配置清单:
apiVersion: v1
kind: Service
metadata:
name: redis
namespace: default
spec:
selector:
app: redis
role: logstor
clusterIP: 10.97.97.97 //Sercice暴露的IP
type: ClusterIP //Service类型
ports:
- port: 6379
targetPort: 6379
Service发展:
userspace: client>>>service>>>proxy>>>service>>>target (watch方法实现)
iptables: client>>>service>>>target
ipvs: similar with iptables
Service类型:
ClusterIP: 仅用于集群内部通信
NodePort: 可通过节点通信
LoadBalaner: 云负载均衡
ExternaName: 可把集群外部资源加进集群
service >>>>edpoint >>>>pod
无头Service eg:
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
namespace: default
spec:
clusterIP: None
ports:
- port: 80
targetPort: 80
存储卷
emptyDir
hostPath
gcePersistentDisk
awsElasticBlockStore
nfs
iscsi
fc (fibre channel)
flocker
glusterfs
rbd
cephfs
gitRepo
secret
persistentVolumeClaim
downwardAPI
projected
azureFileVolume
azureDisk
vsphereVolume
Quobyte
PortworxVolume
ScaleIO
StorageOS
local
emptyDir
使用emptyDir,当Pod分配到Node上时,将会创建emptyDir,并且只要Node上的Pod一直运行,Volume就会一直存。当Pod(不管任何原因)从Node上被删除时,emptyDir也同时会删除,存储的数据也将永久删除。注:删除容器不影响emptyDir。 // emptyDir是写在内存中的,所以速度特别快
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: gcr.io/google_containers/test-webserver
name: test-container
volumeMounts:- mountPath: /cache
name: cache-volume
volumes:
- mountPath: /cache
- name: cache-volume
emptyDir: {}
hostPath
hostPath允许挂载Node上的文件系统到Pod里面去。如果Pod需要使用Node上的文件,可以使用hostPath。
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers: - image: gcr.io/google_containers/test-webserver
name: test-container
volumeMounts:- mountPath: /test-pd
name: test-volume
volumes:
- mountPath: /test-pd
- name: test-volume
hostPath:directory location on host
path: /data
PV(PersistentVolume), PVC(PersistenVolumeClaim):
是K8s的两种重要的资源类型;
用户只需要将pvc挂载到容器中,不用关注存储卷是用什么技术创建的;pvc和pv有点像pod和node的关系,前者消耗后者的资源。pvc可以向pv申请存储空间。
pv可支持多种存储类型。也可以支持hostPath;
pv和pvc是一对一的关系;
创建pv时,不要指名称空间,因为pv是k8s集群级别的;
pv的读写方式(accessModes)有:
ReadWriteOnce:(RWO) 单路读写
ReadOnlyMany:(ROX) 多路只读
ReadWriteMany:(RWX) 多路读写
可以指定存储空间大小(capacity):
storage字段写大小; G和Gi的区别1000和1024
当pv删除时,数据是否会保留,和你定义的回收策略有关,不指默认是return(保留);
创建pv,eg:
创建pvc,eg:
eg: PV+PVC+MySQL+NFS方式挂载存储卷:
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
# namespace: default
labels:
pv: nfs-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
# FIXME: use the rightIP
server: 192.168.1.252
path:"/home/centos7/nfs"
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
labels:
app: wordpress
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 200Mi
storageClassName: nfs
selector:
matchLabels:
pv: nfs-pv
apiVersion: v1
kind: Service
metadata:
name: mysql-service
labels:
app: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
tier: mysql
clusterIP: None
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: mysql
labels:
app: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
tier: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
tier: mysql
spec:
containers:
- image:192.168.1.229/project/mysql:5.7.18
name: mysql
env:
- name:MYSQL_ROOT_PASSWORD
value:“123456”
ports:
- containerPort:3306
name: mysql
volumeMounts:
- name:mysql-persistent-storage
mountPath:/var/lib/mysql
volumes:
- name:mysql-persistent-storage
persistentVolumeClaim:
claimName:mysql-pv-claim
StorageClass:
实现目标就是,有一整块硬盘,由用户发送请求动态生成刚好的pv。
需要有支持restful风格的存储类型,eg:glusterfs。
configMap:
配置中心,用来存放配置信息,也是k8s的资源类型之一。
· 是明文传输
可以以volume的方式挂载在pod的配置文件存放路径。覆盖配置文件;
可以以变量的方法注入配置文件;
配置容器化应用的方式:
1.自定义命令行参数的方式实现;
command,args
2.直接把配置文件备进镜像中;
3.环境变量的方式;
Clould Native的应用程序(支持传环境变量);
Entrypoint脚本预处理;
4.存储卷
创建configmap:
可以通过命令行创建,kebectl create configmp(cm) NAME --from-litral=KEY=VALUE …
创建cm文件,kebectl create configmp(cm) NAME --from-file=KEY=FILE //把file的内容变成VALUE
kebectl create configmp(cm) NAME --from-file=FILE //把文件名当键,文件内容做值;
eg:
挂载卷的方式支持动态注入;可以实时更新,但是有一点点延迟。
eg:
secret:
docker-regristry: 连接docker registry:使kubelet和regristry认证
generic: 创建一个本地的认证
挂载存储卷,详情使用kubectl explain
官方文档:http://docs.kubernetes.org.cn/429.html#Volume
Ingress:
是K8s的一种重要的资源类型
通常Kubernetes暴露服务的方法有三种,Service的NodePort、 LoadBalancer、Ingress
NodePort:暴露节点的端口,通过端口映射进具体的某个服务实现服务发布
LoadBalancer:云平台的负载均衡,LBaas
Ingress:使用开源的反向代理负载均衡器实现服务的发布,例如ingress和nginx、tomcat经常一起发布。
Ingress发布服务原理:
ingress实现服务的发布是通过ingressController实现的。ingressController监听apiserver获取服务状态,通过监听后端的service来动态管理后端的pod服务。
还可以动态注入,监听tsl套接字(openssl)。
具体实现:
首先要为ingressController创建一个namespace
创建成功后,首先创建后端要发布的服务的Service,暴露的Port
创建ingress,在ingress的annotations (注释)里面标注使用的哪个开源服务做的负载均衡+反向代理服务,一般使用nginx。
在spec里,可以写是否使用openssl,如果使用可以加上tsl字段
要定义规则(rules):
可以写虚拟主机,或者url映射。
虚拟主机要在写列表对象,写发布路径,服务名称,服务端口,后端的service。
eg: 虚拟主机
statefulSet:
cattle,pet
PetSet -> sstatefulSet
稳定且唯一的网络标识符;
稳定且持久的存储;
有序优雅的部署和扩展;
有序平滑的删除和终止;
有序的滚动更新;
三个组件: headless、service、StatefulSet、volumeClaimTemplate
可以动态生成pv和pvc
DNS解析 pod_name.servive_name.ns_name.svc.cluster.local
扩缩容是按顺序依次的(创建应该是顺序的,更新或者删除应该是逆序的)
灰度发布:使用setimage来实现,有一个partition(更新区):
partition: N
就是大于N的会被更新
—apiVersion: v1kind: Servicemetadata:
name: nginx
labels:
app: nginxspec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx—apiVersion: apps/v1beta1kind: StatefulSetmetadata:
name: webspec:
serviceName: “nginx”
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:- name: nginx
image: gcr.io/google_containers/nginx-slim:0.8
ports:- containerPort: 80
name: web
volumeMounts: - name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- containerPort: 80
- name: nginx
- metadata:
name: www
annotations:
volume.alpha.kubernetes.io/storage-class: anything
spec:
accessModes: [ “ReadWriteOnce” ]
resources:
requests:
storage: 1Gi
ServiceAccount:
K8s有两类认证:
1.用户认证,通过kubectl认证
2.通过特定的pod认证,使用资源 serviceaccount,在pod里定义
client —> API server
user: username uid
group:
extra:
API
Request path:
/apis/apps/v1/namespaces/default/myapp-deploy
HTTP request verb:
get.post.put.delete
API requests verb:
get,list,patch,watch,create,update,proxy,delete,deletecollection,redirect
Resource:
Subresource:
Namespace:
API group:
https://www.cnblogs.com/dribs/p/10313286.html