架构原理
- CRI(Container Runtime Interface)的远程调用接口
- CNI(Container Networking Interface)
- CSI(Container Storage Interface)
- weave网络插件
- calico网络插件
- Rook持久化存储插件
pod原理
- Pod 里的所有容器,共享的是同一个 Network Namespace,并且可以声明共享同一个Volume
- infra容器
命令
- kubectl apply -f nginx-deployment.yaml
- kubectl get pods -l app=nginx(标签)
- kubectl describe pod nginx-deployment-67594d6bf6-9gdvr
- kubectl describe deployment nginx-deployment
- kubectl exec -it nginx-deployment-5c678cfb6d-lg9lw — /bin/bash
- kubectl delete -f nginx-deployment.yaml
- kubectl create secret generic pass —from-file=./password.txt
- kubectl get secrets
- kubectl edit deployment/nginx-deployment
- kubectl rollout undo deployment/nginx-deployment
- kubectl rollout history deployment/nginx-deployment:查看历史版本
- kubectl rollout undo deployment/nginx-deployment —to-revision=2:回退
kubectl run -i —tty —image busybox dns-test —restart=Never —rm /bin/sh
资料
cnych/kubernetes-learning: 《从Docker到Kubernetes进阶课程》在线文档
01、Kubernetes-基础入门.mdlifecycle生命周期
PostStart
- preStop
健康检查(liveness与readiness探针)
liveness与readiness探针区别
- readiness:是否把进程的服务地址加入Service的负载均衡列表
- liveness:决定是否去重启这个进程来排除故障
一般来讲,Readiness的执行间隔要比Liveness设置的较长一点比较好。因为当后端进程负载高的时候,我们可以暂时从转发列表里面摘除,但是Liveness决定的是进程是否重启,其实这个时候进程不一定需要重启。【不给pod分流量,但不一定要重启pod】所以Liveness的检测周期可以稍微长一点,另外失败的容忍数量也可以多一点。
你或许理解错了Kubernetes中的Readiness和Livenss探针 - 知乎
初始化容器(init container)
- init container针对pod来说的,post start针对main container来说的。
Pause容器(infra container)
- Pause容器 全称infrastucture container(又叫infra)基础容器。
- 业务容器共享Pause容器的网络栈和Volume挂载卷,
Deployment
ReplicaSet
建议使用 Deployment 而不是直接使用 ReplicaSet,除非 你需要自定义更新业务流程或根本不需要更新。 你可能永远不需要操作 ReplicaSet 对象:而是使用 Deployment
Deployment更多的功能
- 事件和状态查看
- 回滚
- 版本记录
- 暂停和启动
不同版本对应不同的rs
describe可以查看rs对应的版本
- kubectl apply -f xxx.yaml —record=true:记录版本
- kubectl rollout history deployment/nginx-deployment:查看历史版本
kubectl rollout undo deployment/nginx-deployment —to-revision=2:回退
RollingUpdateStrategy
HPA(自动扩容)
kubectl autoscale deployment hpa-nginx-deploy —cpu-percent=10 —min=1 —max=10
deployment “hpa-nginx-deploy” autoscaled
- kubectl get hpa
- kubectl get hpa hpa-nginx-deploy -o yaml:查看yaml写法
Service
原理:
每一个node都有一个kube-proxy,负责监听master命令,对本node的iptables进行修改。从而将访问本node的请求路由到其他node(pod)上。
Service类型
- ClusterIP: 通过集群的内部 IP 暴露服务。(默认)【集群内部使用】
- NodePort: 通过每个 Node 节点上的 IP 和静态端⼝(NodePort) 暴露服务。【暴露service】
- LoadBalancer:云厂商
- ExternalName
endpoints
十分钟了解k8s service到pod转发机制_程冯冯的博客-CSDN博客
我们在创建service的时候如果我们设置了selector选中了需要关联的pod,那么就会创建一个与service同名的endpoints。他是用来记录service对应pod的访问地址。
ConfigMap
创建、查看ConfigMap
- kubectl create configmap cm-demo1 —from-file=testcm:从文件创建configmap
- kubectl get configmap
- kubectl get configmap cm-demo1 -o yaml:查看配置
使用ConfigMap
- 使用ConfigMap来填充环境变量
- 通过volumes来使用ConfigMap(ConfigMap作为文件放入volume中)
Secret
Opaque Secret
使用:
- 将secret放入env
- 使用volume保存secrets
kubernetes.io/dockerconfigjson
kubernetes.io/service-account-token
DaemonSet
StatefulSet
貌似少使用
- StatefulSet 其实就是一种特殊的Deployment
- StatefulSet 不同于 ReplicaSet,每个pod hostname和名字都不同。
- 按顺序依次启动
Headless Service
- Service的VIP方式:clusterIP方式
- Service的DNS方式:HeadLess Service
Headless Service的cluterIP是None,即没有一个VIP作为头。
所有pod的ip地址都绑定一个DNS:
**
K8S容器编排之Headless浅谈 - 知乎
PV & PVC
pv回收策略
pv:
pvc:
pvc自动匹配pv
Deployment中使用pvc
StorageClass
创建pvc自动根据storageClass创建出对应的pv。
KubeDNS
环境变量:每个 Pod 启动的时候,会通过环境变量设置所有服务的 IP 和 port 信息,依赖的服务必须在 Pod启动之前就存在。【麻烦】
两个DNS插件,通过ServiceName直接访问Service:kube-dns & CoreDNS
dnsPolicy
域名格式
- 普通的 Service :servicename.namespace.svc.cluster.local或servicename.namespace,同⼀个命名空间下⾯, 甚⾄可以只写成 servicename 即可访问
- HeadLess Service:podname.servicename.namespace.svc.cluster.local
ingress:从外部访问入口
配置Traefik ```yaml
kind: Deployment apiVersion: apps/v1 metadata: name: traefik-ingress-controller namespace: kube-system labels: k8s-app: traefik-ingress-lb spec: replicas: 1 selector: matchLabels: k8s-app: traefik-ingress-lb template: metadata: labels: k8s-app: traefik-ingress-lb name: traefik-ingress-lb spec: serviceAccountName: traefik-ingress-controller terminationGracePeriodSeconds: 60 tolerations:
- operator: "Exists"
nodeSelector:
kubernetes.io/hostname: master
containers:
- image: traefik:v1.7.17
name: traefik-ingress-lb
ports:
- name: http
containerPort: 80
- name: admin
containerPort: 8080
args:
- --api
- --kubernetes
- --logLevel=INFO
kind: Service apiVersion: v1 metadata: name: traefik-ingress-service namespace: kube-system spec: selector: k8s-app: traefik-ingress-lb ports:
- protocol: TCP
port: 80
name: web
- protocol: TCP
port: 8080
name: admin
helm
- Helm 就相当于 kubernetes 环境下的 yum 包管理⼯具。
- 将ingress、deployment、pod打包,一键安装。
打包
我们就可以将打包的 tgz ⽂件分发到任意的服务器上, 通过 helm fetch 就可以获取到该 Chart
了。
操作:
- helm install -f config.yaml stable/mysql —name mydb:config.yaml是自定义配置,覆盖helm默认配置。
- helm get manifest quoting-zebra:查看最终的yaml
- helm install . —dry-run —debug ./mychart:提前查看生成的yaml