常用指令
Kubectl命令行管理对象 类型 命令 描述 基础命令 create 通过文件名或标准输入创建资源。 expose 将一个资源公开为一个新的Kubernetes服务。 run 创建并运行一个特定的镜像,可能是副本。 创建一个deployment或job管理创建的容器。 set 配置应用资源。 修改现有应用程序资源。 get 显示一个或多个资源。 explain 文档参考资料。 edit 使用默认的编辑器编辑一个资源。 delete 通过文件名、标准输入、资源名称或标签选择器来删除资源。 部署命令 rollout 管理资源的发布。 rolling-update 执行指定复制控制的滚动更新。 scale 扩容或缩容Pod数量,Deployment、ReplicaSet、RC或Job。 autoscale 创建一个自动选择扩容或缩容并设置Pod数量。 集群管理命令 certificate 修改证书资源。 cluster-info 显示集群信息。 top 显示资源(CPU/Memory/Storage)使用。需要Heapster运行。 cordon 标记节点不可调度。 uncordon 标记节点可调度。 drain 维护期间排除节点。 taint -------------------------------------- Kubectl命令行管理对象 类型 命令 描述 故障诊断和调试命令 describe 显示特定资源或资源组的详细信息。 logs 在pod或指定的资源中容器打印日志。如果pod只有一个容器,容器名称是可选的。 attach 附加到一个进程到一个已经运行的容器。 exec 执行命令到容器。 port-forward 转发一个或多个本地端口到一个pod。 proxy 为kubernetes API Server启动服务代理。 cp 拷贝文件或目录到容器中。 auth 检查授权。 高级命令 apply 通过文件名或标准输入对资源应用配置。 patch 使用补丁修改、更新资源的字段。 replace 通过文件名或标准输入替换一个资源。 convert 不同的API版本之间转换配置文件。YAML和JSON格式都接受。 设置命令 label 更新资源上的标签。 annotate 在一个或多个资源上更新注释。 completion 用于实现kubectl工具自动补全。 其他命令 api-versions 打印受支持的API版本。 config 修改kubeconfig文件(用于访问API,比如配置认证信息)。 help 所有命令帮助。 plugin 运行一个命令行插件。 version 打印客户端和服务版本信息 ------------------------------------ Kubectl命令行管理对象 示例: # 运行应用程序 kubectl run hello-world --replicas=3 --labels="app=example" --image=nginx:1.10 --port=80 # 显示有关Deployments信息 kubectl get deployments hello-world kubectl describe deployments hello-world # 显示有关ReplicaSet信息 kubectl get replicasets kubectl describe replicasets # 创建一个Service对象暴露Deployment(在88端口负载TCP流量) kubectl expose deployment hello-world --port=88 --type=NodePort --target-port=80 --name=example-service # 创建一个Service对象暴露Deployment(在4100端口负载UDP流量) kubectl expose deployment hello-world --port=4100 --type=NodePort --protocol=udp --target-port=80 -- name=example-service # 显示有关Service信息 kubectl describe services example-service # 使用节点IP和节点端口访问应用程序 curl http://<public-node-ip>:<node-port> #根据端口查询服务 netstat -anpt | grep : 端口号 #ingress查看 kubectl get svc -n ingress-ngnix #获取configmap kubuvtl get cm #configmap详细信息 kubectl describe cm configmap名称 #修改configmap kubectl edit configmap configmap名称 #阿里云时间同步服务器 ntpdate ntp1.aliyun.com #获取pv kubectl get pv #获取pvc kubectl get pvc #获取指定pv的内容输出格式为yaml kubectl get pv pv名称 -o yaml #修改内容 kubectl edit pv pv名称 #通过 kubectl replace 命令完成对Node 状态的修改 [root@master node]# kubectl replace -f unschedule_node.yaml node/192.168.0.222 replaced [root@master node]# kubectl get nodes NAME STATUS ROLES AGE VERSION 192.168.0.144 Ready <none> 25d v1.11.6 192.168.0.148 Ready <none> 25d v1.11.6 192.168.0.222 Ready,SchedulingDisabled <none> 5d v1.11.6 #查看Node的状态,可以观察到在Node的状态中增加了一项SchedulingDisabled,对于后续创建的Pod,系统将不会再向该Node进行调度。也可以不使用配置文件,直接使用 kubectl patch 命令完成: kubectl patch node k8s-node-1 -p '{"spec": {"unschedulaable": true}}' #需要注意的是,将某个Node脱离调度范围时,在其上运行的pod并不会自动停止,管理员需要手动停止在改Node是上运行的pod. #同样,如果需要将某个node重新纳入集群调度范围,则将unschedulable 设置为false,再次执行 kubectl replace 或者kubectl patch 命令就能恢复系统对改node的调度。 #第三种方法: #使用kubectl cordon <node_name> 对某个Node 进行隔离调度操作 [root@master node]# kubectl cordon 192.168.0.148 node/192.168.0.148 cordoned [root@master node]# kubectl get nodes NAME STATUS ROLES AGE VERSION 192.168.0.144 Ready <none> 25d v1.11.6 192.168.0.148 Ready,SchedulingDisabled <none> 25d v1.11.6 192.168.0.222 Ready,SchedulingDisabled <none> 5d v1.11.6 #恢复调度操作: [root@master node]# kubectl uncordon 192.168.0.222 node/192.168.0.222 uncordoned [root@master node]# kubectl get nodes NAME STATUS ROLES AGE VERSION 192.168.0.144 Ready <none> 25d v1.11.6 192.168.0.148 Ready <none> 25d v1.11.6 192.168.0.222 Ready <none> 5d v1.11.6 #创建命名空间 kubectl create namespace 名称 #获取命名空间 kubectl get namespace #删除命名空间 kubectl delete namespace 名称 #获取目前API接口信息 kubectl api-resources #对运行时容器进行修改 kubectl patch pod rc-容器app名称-kpiqt -p #对副本扩缩容 kubectl scale rc rc-容器app名称 —replicas=扩缩容数量 #pod对副本自动进行扩缩容 kubectl autoscale rc rc-容器app名称 --min=1 --max=4 kubectl常用命令: kubectl cluster-info #查看集群信息 kubectl describe pod -n kube-system kube-flannel-ds-amd64-trpqq #查看pod的描述信息 kubectl get pods -n kube-system #查看指定命名空间的pod kubectl create deployment NAME --image=image [--dry-run] [options] #创建deployment, dry-run为true就是测试不执行 kubectl create serviceaccount admin -o yaml --dry-run #针对所有可以用kubectl create 创建的资源,都可以加 -o yaml --dry-run ,用来导出yaml标准格式的文件。 kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP #为deployment创建service, --name为service的名字, --port为暴露端口, --target-port为目标pod端口 dig -t A nginx.default.svc.cluster.local @10.96.0.10 #验证是否能正确解析service, @后边的ip为k8s的dns地址 kubectl describe svc nginx #查看名为nginx的这个service的详细信息 kubectl get pods --show-labels #查看pod的标签 kubectl scale deployment nginx-deploy --replicas=3 #扩容或缩容, --replicas为数量 wget -O - -q nginx-deploy kubectl rollout undo deployment myapp-deploy --to-revision=1 #回滚到指定版本, 默认回滚到上一版本 kubectl explain pod #查看pod用法的详细信息(参数选项等)
kubectl指令使用
kubectl工具的使用 #创建 kubectl run nginx --replicas=3 --labels="app=nginx-example" --image=nginx:1.17.4 --port=80 #查看 kubectl get deploy kubectl get pods --show-labels kubectl get pods -l app=example kubectl get pods -o wide #发布 kubectl expose deployment nginx --port=88 --type=NodePort --tartget-port=80 --name=nginx-service kubectl describe service nginx-service #故障排查 kubectl describe TYPE NAME_PREFIX kubectl logs nginx-xxx kubectl exec -it nginx-xxx bash #更新 kubectl set image deployment/nginx nginx=nginx:1.17.4 或 kubectl edit deployment/nginx #资源发布管理 kubectl rollout status deployment/nginx kubectl rollout history deployment/nginx kubectl rollout history deployment/nginx --revision=3 kubectl scale deployment nginx --replicas=10 #回滚 kubectl rollout undo deployment/nginx-deployment kubectl rollout undo deployment/nginx-deployment --to-revision=3 #删除 kubectl delete deploy/nginx kubectl delete svc/nginx-service #写yaml文件用到的api #定义配置时,指定最新稳定版API(当前为v1) kubectl api-versions
K8S创建的相关yaml文件
一、K8S-yaml的使用及命令
YAML配置文件管理对象 对象管理: # 创建deployment资源 kubectl create -f nginx-deployment.yaml # 查看deployment kubectl get deploy # 查看ReplicaSet kubectl get rs # 查看pods所有标签 kubectl get pods --show-labels # 根据标签查看pods kubectl get pods -l app=nginx # 滚动更新镜像 kubectl set image deployment/nginx-deployment nginx=nginx:1.11 或者 kubectl edit deployment/nginx-deployment 或者 kubectl apply -f nginx-deployment.yaml # 实时观察发布状态: kubectl rollout status deployment/nginx-deployment # 查看deployment历史修订版本 kubectl rollout history deployment/nginx-deployment kubectl rollout history deployment/nginx-deployment --revision=3 # 回滚到以前版本 kubectl rollout undo deployment/nginx-deployment kubectl rollout undo deployment/nginx-deployment --to-revision=3 # 扩容deployment的Pod副本数量 kubectl scale deployment nginx-deployment --replicas=10 # 设置启动扩容/缩容 kubectl autoscale deployment nginx-deployment --min=10 --max=15 --cpu-percent=80
二、POD
实例1:三种策略
apiVersion: v1 kind: Pod metadata: name: pod-test labels: os: centos spec: containers: - name: hello image: centos:7 env: - name: Test value: "123456" command: ["bash","-c","while true;do date;sleep 1;done"] restartPolicy: OnFailure 支持三种策略: Always:当容器终止退出后,总是重启容器,默认策略。 OnFailure:当容器异常退出(退出状态码非0)时,才重启容器。 Never:当容器终止退出,从不重启容器。
实例2:数据持久化和共享
apiVersion: v1 kind: Pod metadata: name: pod-test1 labels: test: centos spec: containers: # 第一个容器 - name: hello-write image: centos:7 command: ["bash","-c","for i in {1..1000};do echo $i >> /data/hello;sleep 1;done"] # 第二个容器 - name: hello-read image: centos:7 command: ["bash","-c","for i in {1..1000};do cat $i >> /data/hello;sleep 1;done"] volumeMounts: - name: data mountPath: /data # 数据卷 volumes: - name: data hostPath: path: /data
实例3:pod的端口映射
apiVersion: v1 kind: Pod metadata: name: nginx-pod labels: app: nginx spec: containers: - name: nginx image: nginx:1.10 ports: - name: http containerPort: 80 hostIP: 0.0.0.0 hostPort: 80 protocol: TCP - name: https containerPort: 443 hostIP: 0.0.0.0 hostPort: 443 protocol: TCP
实例4
apiVersion: v1 kind: Pod metadata: name: nginx-pod labels: app: nginx spec: containers: - name: nginx image: nginx:1.10 ports: - containerPort: 80 livenessProbe: httpGet: path: /index.html port: 80
详细解析
apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中 kind: Pod #指定创建资源的角色/类型 metadata: #资源的元数据/属性 name: web04-pod #资源的名字,在同一个namespace中必须唯一 labels: #设定资源的标签,详情请见http://blog.csdn.net/liyingke112/article/details/77482384 k8s-app: apache version: v1 kubernetes.io/cluster-service: "true" annotations: #自定义注解列表 - name: String #自定义注解名字 spec:#specification of the resource content 指定该资源的内容 restartPolicy: Always #表明该容器一直运行,默认k8s的策略,在此容器退出后,会立即创建一个相同的容器 nodeSelector: #节点选择,先给主机打标签kubectl label nodes kube-node1 zone=node1 zone: node1 containers: - name: web04-pod #容器的名字 image: web:apache #容器使用的镜像地址 imagePullPolicy: Never #三个选择Always、Never、IfNotPresent,每次启动时检查和更新(从registery)images的策略, # Always,每次都检查 # Never,每次都不检查(不管本地是否有) # IfNotPresent,如果本地有就不检查,如果没有就拉取 command: ['sh'] #启动容器的运行命令,将覆盖容器中的Entrypoint,对应Dockefile中的ENTRYPOINT args: ["$(str)"] #启动容器的命令参数,对应Dockerfile中CMD参数 env: #指定容器中的环境变量 - name: str #变量的名字 value: "/etc/run.sh" #变量的值 resources: #资源管理,请求请见http://blog.csdn.net/liyingke112/article/details/77452630 requests: #容器运行时,最低资源需求,也就是说最少需要多少资源容器才能正常运行 cpu: 0.1 #CPU资源(核数),两种方式,浮点数或者是整数+m,0.1=100m,最少值为0.001核(1m) memory: 32Mi #内存使用量 limits: #资源限制 cpu: 0.5 memory: 32Mi ports: - containerPort: 80 #容器开发对外的端口 name: httpd #名称 protocol: TCP livenessProbe: #pod内容器健康检查的设置,详情请见http://blog.csdn.net/liyingke112/article/details/77531584 httpGet: #通过httpget检查健康,返回200-399之间,则认为容器正常 path: / #URI地址 port: 80 #host: 127.0.0.1 #主机地址 scheme: HTTP initialDelaySeconds: 180 #表明第一次检测在容器启动后多长时间后开始 timeoutSeconds: 5 #检测的超时时间 periodSeconds: 15 #检查间隔时间 #也可以用这种方法 #exec: 执行命令的方法进行监测,如果其退出码不为0,则认为容器正常 # command: # - cat # - /tmp/health #也可以用这种方法 #tcpSocket: //通过tcpSocket检查健康 # port: number lifecycle: #生命周期管理 postStart: #容器运行之前运行的任务 exec: command: - 'sh' - 'yum upgrade -y' preStop: #容器关闭之前运行的任务 exec: command: ['service httpd stop'] volumeMounts: #详情请见http://blog.csdn.net/liyingke112/article/details/76577520 - name: volume #挂载设备的名字,与volumes[*].name 需要对应 mountPath: /data #挂载到容器的某个路径下 readOnly: True volumes: #定义一组挂载设备 - name: volume #定义一个挂载设备的名字 #meptyDir: {} hostPath: path: /opt #挂载设备类型为hostPath,路径为宿主机下的/opt,这里设备类型支持很多种
Pod管理-创建/查询/更新/删除
基本管理: # 创建pod资源 kubectl create -f pod.yaml # 查看pods kubectl get pods pod-test # 查看pod描述 kubectl describe pod pod-test # 替换资源 kubectl replace -f pod.yaml -force # 删除资源 kubectl delete pod pod-test 健康管理 提供Probe机制,有以下两种类型: livenessProbe 如果检查失败,将杀死容器,然后根据Pod的重启策略来决定是否 重启。 readinessProbe 如果检查失败,Kubernetes会把Pod从服务代理的分发后端剔除。 Probe支持以下三种检查方法: httpGet 发送HTTP请求,返回200-400范围状态码为成功。 exec 执行Shell命令返回状态码是0为成功。 tcpSocket 发起TCP Socket建立成功。
三、Deployment
简单例子
apiVersion: apps/v1beta2 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.10 ports: - containerPort: 80
详细解析
apiVersion: extensions/v1beta1 kind: Deployment metadata: <Object> spec: <Object> minReadySeconds: <integer> #设置pod准备就绪的最小秒数 paused: <boolean> #表示部署已暂停并且deploy控制器不会处理该部署 progressDeadlineSeconds: <integer> strategy: <Object> #将现有pod替换为新pod的部署策略 rollingUpdate: <Object> #滚动更新配置参数,仅当类型为RollingUpdate maxSurge: <string> #滚动更新过程产生的最大pod数量,可以是个数,也可以是百分比 maxUnavailable: <string> # type: <string> #部署类型,Recreate,RollingUpdate replicas: <integer> #pods的副本数量 selector: <Object> #pod标签选择器,匹配pod标签,默认使用pods的标签 matchLabels: <map[string]string> key1: value1 key2: value2 matchExpressions: <[]Object> operator: <string> -required- #设定标签键与一组值的关系,In, NotIn, Exists and DoesNotExist key: <string> -required- values: <[]string> revisionHistoryLimit: <integer> #设置保留的历史版本个数,默认是10 rollbackTo: <Object> revision: <integer> #设置回滚的版本,设置为0则回滚到上一个版本 template: <Object> -required- metadata: spec: containers: <[]Object> #容器配置 - name: <string> -required- #容器名、DNS_LABEL image: <string> #镜像 imagePullPolicy: <string> #镜像拉取策略,Always、Never、IfNotPresent ports: <[]Object> - name: #定义端口名 containerPort: #容器暴露的端口 protocol: TCP #或UDP volumeMounts: <[]Object> - name: <string> -required- #设置卷名称 mountPath: <string> -required- #设置需要挂载容器内的路径 readOnly: <boolean> #设置是否只读 livenessProbe: <Object> #就绪探测 exec: command: <[]string> httpGet: port: <string> -required- path: <string> host: <string> httpHeaders: <[]Object> name: <string> -required- value: <string> -required- scheme: <string> initialDelaySeconds: <integer> #设置多少秒后开始探测 failureThreshold: <integer> #设置连续探测多少次失败后,标记为失败,默认三次 successThreshold: <integer> #设置失败后探测的最小连续成功次数,默认为1 timeoutSeconds: <integer> #设置探测超时的秒数,默认1s periodSeconds: <integer> #设置执行探测的频率(以秒为单位),默认1s tcpSocket: <Object> #TCPSocket指定涉及TCP端口的操作 port: <string> -required- #容器暴露的端口 host: <string> #默认pod的IP readinessProbe: <Object> #同livenessProbe resources: <Object> #资源配置 requests: <map[string]string> #最小资源配置 memory: "1024Mi" cpu: "500m" #500m代表0.5CPU limits: <map[string]string> #最大资源配置 memory: cpu: volumes: <[]Object> #数据卷配置 - name: <string> -required- #设置卷名称,与volumeMounts名称对应 hostPath: <Object> #设置挂载宿主机路径 path: <string> -required- type: <string> #类型:DirectoryOrCreate、Directory、FileOrCreate、File、Socket、CharDevice、BlockDevice - name: nfs nfs: <Object> #设置NFS服务器 server: <string> -required- #设置NFS服务器地址 path: <string> -required- #设置NFS服务器路径 readOnly: <boolean> #设置是否只读 - name: configmap configMap: name: <string> #configmap名称 defaultMode: <integer> #权限设置0~0777,默认0664 optional: <boolean> #指定是否必须定义configmap或其keys items: <[]Object> - key: <string> -required- path: <string> -required- mode: <integer> restartPolicy: <string> #重启策略,Always、OnFailure、Never nodeName: <string> nodeSelector: <map[string]string> imagePullSecrets: <[]Object> hostname: <string> hostPID: <boolean> status: <Object>
四、Service
服务类型
服务类型: ClusterIP 分配一个内部集群IP地址,只能在集群内部访问(同Namespace内的Pod),默认ServiceType。 NodePort 分配一个内部集群IP地址,并在每个节点上启用一个端口来暴露服务,可以在集群外部访问。 访问地址:<NodeIP>:<NodePort> LoadBalancer 分配一个内部集群IP地址,并在每个节点上启用一个端口来暴露服务。 除此之外,Kubernetes会请求底层云平台上的负载均衡器,将每个Node([NodeIP]:[NodePort])作为后端添加进去。 ExternalName 通过CNAME将Service与externalName的值映射。要求kube-dns的版本为v1.7+。
实例1
apiVersion: v1 kind: Service metadata: labels: run: nginx name: nginx namespace: default spec: ports: - port: 88 targetPort: 80 selector: app: nginx
实例2:指定ip
apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: nginx ports: - name: http protocol: TCP port: 888 targetPort: 80 # 可以指定ip clusterIP: "10.10.10.123" # - name: https # protocol: TCP # port: 443 # targetPort: 9377
实例3:发布服务
apiVersion: v1 kind: Service metadata: name: nginx-service labels: app: nginx spec: selector: app: nginx ports: - name: http port: 8080 targetPort: 80 nodePort: 30001 type: NodePort
k8s是什么?
Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。
通过Kubernetes你可以:
快速部署应用
快速扩展应用
无缝对接新的应用功能
节省资源,优化硬件资源的使用
我们的目标是促进完善组件和工具的生态系统,以减轻应用程序在公有云或私有云中运行的负担。
Kubernetes 特点
可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)
可扩展: 模块化, 插件化, 可挂载, 可组合
自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展
Kubernetes是Google 2014年创建管理的,是Google 10多年大规模容器管理技术Borg的开源版本。
Kubernetes 特点
可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)
可扩展: 模块化, 插件化, 可挂载, 可组合
自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展
Kubernetes是Google 2014年创建管理的,是Google 10多年大规模容器管理技术Borg的开源版本。
Why containers?
为什么要使用容器?通过以下两个图对比:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bkWcJzyz-1626275743487)(https://d33wubrfki0l68.cloudfront.net/e7b766e0175f30ae37f7e0e349b87cfe2034a1ae/3e391/images/docs/why_containers.svg#height=150&id=UvIIQ&originHeight=150&originWidth=196&originalType=binary&status=done&style=none&width=196)]
传统的应用部署方式是通过插件或脚本来安装应用。这样做的缺点是应用的运行、配置、管理、所有生存周期将与当前操作系统绑定,这样做并不利于应用的升级更新/回滚等操作,当然也可以通过创建虚机的方式来实现某些功能,但是虚拟机非常重,并不利于可移植性。
新的方式是通过部署容器方式实现,每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。相对于虚拟机,容器能快速部署,由于容器与底层设施、机器文件系统解耦的,所以它能在不同云、不同版本操作系统间进行迁移。
容器占用资源少、部署快,每个应用可以被打包成一个容器镜像,每个应用与容器间成一对一关系也使容器有更大优势,使用容器可以在build或release 的阶段,为应用创建容器镜像,因为每个应用不需要与其余的应用堆栈组合,也不依赖于生产环境基础结构,这使得从研发到测试、生产能提供一致环境。类似地,容器比虚机轻量、更“透明”,这更便于监控和管理。最后,
容器优势总结:
**快速创建/部署应用:**与VM虚拟机相比,容器镜像的创建更加容易。
**持续开发、集成和部署:**提供可靠且频繁的容器镜像构建/部署,并使用快速和简单的回滚(由于镜像不可变性)。
**开发和运行相分离:**在build或者release阶段创建容器镜像,使得应用和基础设施解耦。
**开发,测试和生产环境一致性:**在本地或外网(生产环境)运行的一致性。
**云平台或其他操作系统:**可以在 Ubuntu、RHEL、 CoreOS、on-prem、Google Container Engine或其它任何环境中运行。
**Loosely coupled,分布式,弹性,微服务化:**应用程序分为更小的、独立的部件,可以动态部署和管理。
资源隔离
**资源利用:**更高效
使用Kubernetes能做什么?
可以在物理或虚拟机的Kubernetes集群上运行容器化应用,Kubernetes能提供一个以“容器为中心的基础架构”,满足在生产环境中运行应用的一些常见需求,如:
多个进程(作为容器运行)协同工作。(Pod)
存储系统挂载
Distributing secrets
应用健康检测
应用实例的复制
Pod自动伸缩/扩展
Naming and discovering
负载均衡
滚动更新
资源监控
日志访问
调试应用程序
提供认证和授权
Kubernetes是什么意思?K8S?
Kubernetes的名字来自希腊语,意思是“舵手” 或 “领航员”。_K8s_是将8个字母“ubernete”替换为“8”的缩写。
Master 组件
Master组件提供集群的管理控制中心。
Master组件可以在集群中任何节点上运行。但是为了简单起见,通常在一台VM/机器上启动所有Master组件,并且不会在此VM/机器上运行用户容器。请参考 构建高可用群集以来构建multi-master-VM。
kube-apiserver
kube-apiserver用于暴露Kubernetes API。任何的资源请求/调用操作都是通过kube-apiserver提供的接口进行。请参阅构建高可用群集。
ETCD
etcd是Kubernetes提供默认的存储系统,保存所有集群数据,使用时需要为etcd数据提供备份计划。
kube-controller-manager
kube-controller-manager运行管理控制器,它们是集群中处理常规任务的后台线程。逻辑上,每个控制器是一个单独的进程,但为了降低复杂性,它们都被编译成单个二进制文件,并在单个进程中运行。
这些控制器包括:
节点(Node)控制器。
副本(Replication)控制器:负责维护系统中每个副本中的pod。
端点(Endpoints)控制器:填充Endpoints对象(即连接Services&Pods)。
Service Account
和Token控制器:为新的
Namespace
创建默认帐户访问API Token。
cloud-controller-manager
云控制器管理器负责与底层云提供商的平台交互。云控制器管理器是Kubernetes版本1.6中引入的,目前还是Alpha的功能。
云控制器管理器仅运行云提供商特定的(controller loops)控制器循环。可以通过将--cloud-provider flag设置为external启动kube-controller-manager ,来禁用控制器循环。
cloud-controller-manager 具体功能:
节点(Node)控制器
路由(Route)控制器
Service控制器
卷(Volume)控制器
kube-scheduler
kube-scheduler 监视新创建没有分配到Node的Pod,为Pod选择一个Node。
插件 addons
插件(addon)是实现集群pod和Services功能的 。Pod由Deployments,ReplicationController等进行管理。Namespace 插件对象是在kube-system Namespace中创建。
DNS
虽然不严格要求使用插件,但Kubernetes集群都应该具有集群 DNS。
群集 DNS是一个DNS服务器,能够为 Kubernetes services提供 DNS记录。
由Kubernetes启动的容器自动将这个DNS服务器包含在他们的DNS searches中。
了解更多详情
用户界面
kube-ui提供集群状态基础信息查看。更多详细信息,请参阅使用HTTP代理访问Kubernetes API
容器资源监测
容器资源监控提供一个UI浏览监控数据。
Cluster-level Logging
Cluster-level logging,负责保存容器日志,搜索/查看日志。
节点(Node)组件
节点组件运行在Node,提供Kubernetes运行时环境,以及维护Pod。
kubelet
kubelet是主要的节点代理,它会监视已分配给节点的pod,具体功能:
安装Pod所需的volume。
下载Pod的Secrets。
Pod中运行的 docker(或experimentally,rkt)容器。
定期执行容器健康检查。
Reports the status of the pod back to the rest of the system, by creating a mirror pod if necessary.
Reports the status of the node back to the rest of the system.
kube-proxy
kube-proxy通过在主机上维护网络规则并执行连接转发来实现Kubernetes服务抽象。
docker
docker用于运行容器。
RKT
rkt运行容器,作为docker工具的替代方案。
supervisord
supervisord是一个轻量级的监控系统,用于保障kubelet和docker运行。
fluentd
fluentd是一个守护进程,可提供cluster-level logging.。
一、Pod
指令
#创建pod kubectl create -f pod配置文件 #运行pod kubectl apply -f pod.yaml #获取pod信息 describe pod 镜像id kubectl get pod kubectl log 镜像的ID -c 容器名称 #删除pod kubectl delete pod podID #pod详细信息 kubectl get pod -o wide
资源清单格式
apiVersion: group/apiversion # 如果没有给定group 名称,那么默认为 core,可以使用 kubectl api- versions # 获取当前 k8s 版本上所有的 apiVersion 版本信息( 每个版本可能不同 ) kind: #资源类别 metadata: #资源元数据 name namespace lables annotations # 主要目的是方便用户阅读查找 spec: # 期望的状态(disired state) status: # 当前状态,本字段有 Kubernetes 自身维护,用户不能去定义
资源清单的常用命令
[root@k8s-master01 ~]# kubectl api-versions [root@k8s-master01 ~]# kubectl explain pod [root@k8s-master01 ~]# kubectl explain Ingress [root@k8s-master01 ~]# kubectl explain pod
创建简单pod
apiVersion: v1 kind: Pod metadata: name: myapp labels: app: myapp version: v1 spec: containers: - name: app images: 镜像名:v1 - name: test images: 镜像名:v1
pod生命周期:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iBEUZibC-1626275743489)(images%5Cpod%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F.png#id=J7m1o&originalType=binary&status=done&style=none)]
当cri在初始化之后,会加载一个pause基础容器,这个是对pod中的所有其他容器服务的,包括数据卷,网络等等,之后会初始化容器Init C,这个容器初始化动作为串行执行,正常退出码为0,不为零会根据重启策略其判断执行,之后执行成功会消亡。加载成功之后进入Main C主容器的运行,在运行起始的时候可以执行一些命令或者脚本,结束的时候也可以运行一些命令和脚本,在运行开始多少秒之后进行readness探测,在readness没探测成功之前pod的状态不能变为running状态;在运行期间,还有liveness参与,liveness主要是探测主容器状态,如果主容器不可用或者异常,执行重启或者删除等操作,根据重启策略来操作。
Init 容器
init模板
apiVersion: v1 kind: Pod metadata: name: myapp-pod labels: app: myapp spec: containers: - name: myapp-container image: busybox command: ['sh', '-c', 'echo The app is running! && sleep 3600'] initContainers: - name: init-myservice image: busybox command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;'] - name: init-mydb image: busybox command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']
kind: Service apiVersion: v1 metadata: name: myservice spec: ports: - protocol: TCP port: 80 targetPort: 9376 --- kind: Service apiVersion: v1 metadata: name: mydb spec: ports: - protocol: TCP port: 80 targetPort: 9377
探针检测
检测探针 - 就绪检测
readinessProbe-httpget
apiVersion: v1 kind: Pod metadata: name: readiness-httpget-pod namespace: default spec: containers: - name: readiness-httpget-container image: wangyanglinux/myapp:v1 imagePullPolicy: IfNotPresent readinessProbe: httpGet: port: 80 path: /index1.html initialDelaySeconds: 1 periodSeconds: 3
检测探针 - 存活检测
livenessProbe-exec
apiVersion: v1 kind: Pod metadata: name: liveness-exec-pod namespace: default spec: containers: - name: liveness-exec-container image: hub.atguigu.com/library/busybox imagePullPolicy: IfNotPresent command: ["/bin/sh","-c","touch /tmp/live ; sleep 60; rm -rf /tmp/live; sleep 3600"] livenessProbe: exec: command: ["test","-e","/tmp/live"] initialDelaySeconds: 1 periodSeconds: 3
livenessProbe-httpget
apiVersion: v1 kind: Pod metadata: name: liveness-httpget-pod namespace: default spec: containers: - name: liveness-httpget-container image: hub.atguigu.com/library/myapp:v1 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 livenessProbe: httpGet: port: http path: /index.html initialDelaySeconds: 1 periodSeconds: 3 timeoutSeconds: 10
livenessProbe-tcp
apiVersion: v1 kind: Pod metadata: name: probe-tcp spec: containers: - name: nginx image: hub.atguigu.com/library/myapp:v1 livenessProbe: initialDelaySeconds: 5 timeoutSeconds: 1 tcpSocket: port: 80
启动、退出动作
apiVersion: v1 kind: Pod metadata: name: lifecycle-demo spec: containers: - name: lifecycle-demo-container image: nginx lifecycle: postStart: exec: command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"] preStop: exec: command: ["/bin/sh", "-c", "echo Hello from the poststop handler > /usr/share/message"]