参数解释:-n :指定名称空间-o :详细信息-w :动态监控kubectl describe //查看详细kubectl get //索要资源kubectl apply -f 资源清单的路径 //创建资源kubectl delete -f 资源清单的路径 //删除资源kubectl exec -it test-6799fc88d8-42gkv -c nginx -- bash //进入pod容器kubectl run test --image=nginx //启动容器kubectl explain pod //查看帮助配置清单kubectl --context=d get pod --show-labels // 查看标签kubectl --context=d get namespace //查看名称空间kubectl --context=d get deployments //查看控制器kubectl --context=d delete -n jeff //查看控制器kubectl --context=d describe pods -n sg-bs bikecompute-675b979885-l8xtz //查看详情kubectl rollout history deployment test // 版本历史kubectl rollout undo deployment test // 回滚上一个版本kubectl rollout undo deployment test --to-revision=1 // 回滚指定版本journalctl -f -u kubelet.service //查看报错日志kubectl logs -f -n kube-system coredns-6d56c8448f-5zzwn // 查看dns日志tail -f /var/log/messages //查看系统日志kubectl describe pod pod服务名字 //查看pod启动失败原因,pod报错信息架构图:

kube-apiserver:中央管理器,各个组件的调用入口etcd:集群数据库,存储节点的基础数据,比如:cpu,磁盘大小等scheduler:调度器,调度数据kubelet:node节点接受master的kube-apiserver发来的部署信息kube-proxy:node网桥,建立node容器网络互通controller-manager:kube-apiserver告诉控制器pod创建好了,控制器监控pod状态,监控数据 最少需要6套认证组件之间安全机制:证书,根据上图可见最少6套证书k8s中控制器分为:deployment、DaemonSet、StatufluSetDeployment:一般用来部署长期运行的、无状态的应用 特点:集群之中,随机部署 DaemonSet:每一个节点上部署一个Pod,删除节点自动删除对应的Pod(zabbix-agent) 特点:每一台上有且只有一台StatudfluSet: 部署有状态应用 特点:有启动顺序# CluserIP : 向集群内部暴露一个IP,外部无法访问# NodePort : 在宿主主机中开启一个端口与负载均衡IP的端口一一对应,外界可以使用宿主主机的端口访问集群内部服务,端口随机,也可以固定端口。一般测试用,正式环境不实用,因为端口占用严重# LoadBalancer:是实现暴露服务的另一种解决方案,它依赖于公有云弹性IP实现# ExternalName service 是sercice的一个特例,它没有选择器,也没有定义任何端口。它的作用是返回集群外service的外部别名。它将外部地址经过集群内部的再一次封装(实际上就是集群DNS服务器将CNAME解析到外部地址上),实现了集群内部访问即可。例如你们公司的镜像仓库,最开始时用ip访问,等到后面域名下来了再使用域名访问。你不可能去修改每处的引用。但是可以创建一个ExternalName,首先指向到IP,等后面再指向域名ingress-Nginx:负载均衡器service主要作用:提供负载均衡ingress主要作用:提供域名转发集群流量入口ingress工作原理:根据ingress配置清单,动态生成Nginx配置,并且使其生效,之后通过nginx反向代理转发流量到pod中Nginx配置文件:vi /etc/nginx/nginx.conf
常规版本:
1.前端输入www.xxxx.com2.本地hosts文件寻找ip地址,如果没有找到进行第三步,找到进行第四步3.DNS域名解析ip地址4.浏览器带着ip访问服务器进行三次握手,建立tcp连接5.浏览器发出http请求报文6.进入云服务外部网关(k8s外部网关),服务器接收到请求7.外部云服务网关根据ingress配置的域名转到对应的ingress-nginx8.ingress-nginx生成动态nginx9.nginx转到service10.service转到自己编写的内部反向代理网关11.内部代理网关转到相应的pod12.pod有可能需要进行rpc调用13.pod返回响应结果14.浏览器解码渲染pod生命周期:1.创建pod2.创建主容器3.依次创建业务容器4.执行回调钩子5.进行探测(监控容器是否活着,和监控是否能被外网访问,容器挂了会自动创建新的)6.执行结束回调钩子7.结束业务容器8.结束主容器9.销毁pod
主容器作用:1.提供pod中基础网络(基础命名空间)2.提供共享储存3.监控业务容器apiVersion :apps/v1 #指定k8s部署的api版本号kind : Deployment #指定资源类型(pod)metadata : #记录部署应用的基础信息 name: admin namespace: sg-bsspec : #指定部署详情 # k8s部署一个yaml的应用:kubectl apply -f [配置清单]pod清单
# kubectl explain Pod # 查看配置清单帮助apiVersion: v1kind: Podmetadata: name: test-podspec: containers: - name: nginx image: nginx - name: tomcat image: tomcat目的:访问www.test.com重定向到https://www.baidu.com方式一:直接在Ingress配置清单设置。方式二:在配置中心configMap中配置,然后在Ingress配置清单中配置configMap中的值。kind: IngressapiVersion: extensions/v1beta1metadata: name: ingress-ingress-nginx-tls annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/permanent-redirect: https://www.baidu.comspec: rules: - host: www.test.com http: paths: - path: / backend: serviceName: wordpress-nginx servicePort: 80configmap是配置中心,其他地方需要使用就挂载configmap创建configmap:
# 创建名称空间apiVersion: v1kind: Namespacemetadata: name: sg-bs labels: app: sg-bs---# ConfigMap是名称空间级资源apiVersion: v1kind: ConfigMapmetadata: name: test-configmap namespace: sg-bsdata: # 健 : 值 level: debug # 配置的信息使用configmap:
使用configmap中的level:debug## 使用挂载方式,将配置文件挂载到容器中# 使用kind: DeploymentapiVersion: apps/v1metadata: name: nginx-configspec: selector: matchLabels: app: nginx-config template: metadata: labels: app: nginx-config spec: containers: - name: nginx image: nginx volumeMounts: # 挂载 - mountPath: /etc/nginx/conf.d # 挂载路径 name: nginx-config-configmap # 存储卷名字 volumes: - name: nginx-config persistentVolumeClaim: claimName: nginx-config - name: nginx-config-configmap configMap: name: test-configmap # ConfigMap名字 items: - key: level path: level # 最终路径为:/etc/nginx/conf.d/levelhttps://www.cnblogs.com/guyouyin123/p/15630025.html#
1.emptyDir:pod调度到节点时创建的临时目录,pod删除随之删除,用于容器间分享文件2.hostpath:节点存储卷,挂载宿主机的文件或目录到pod中3.pv/pvc:外部存储系统中的一款存储空间,具有持久性,生命周期独立于pod PV:描述一个具体的Volume属性,比如Volume的类型、挂载目录、远程存储服务器地址等。相当于磁盘分区 PVC:描述 Pod想要使用的持久化属性,比如存储大小、读写权限等。4.StorageClass:充当pv模版,动态创建pv,自动构建相对应的pv持久化存储卷5.configmap:配置中心,挂载到pod即可以使用Secret将密码转为密文,写入config中,起到加密的作用使用方式:https://www.cnblogs.com/guyouyin123/p/15668227.html容器探针:就是检查容器的状态。健康检查方式2种:1.存活性探测:检查容器是否正常运行2.就绪性探测:检查容器是否能够对外提供服务两者维度不一样两者处理方式不一样: 存活性检查失败:把容器删掉 就绪性检查失败:移除集群(移除负载均衡)存活性:livenessProbe就绪性:readinessProbe存活性探测有3种方式:1.ExecAction:在容器内执行指定的命令。看执行成功与否2.TCPSocketAction:对指定端口上Pod的IP地址执行TCP检查。相当于ping3.HTTPGetAction:GET在指定的端口和路径上针对Pod的IP地址执行HTTP请求。相当于http请求服务内部的接口,一般服务内部创建一个ping路由。https://www.cnblogs.com/guyouyin123/p/15603581.htmlExec:在容器内执行指定的命令
apiVersion: v1kind: Podmetadata: name: probe-exec namespace: defualtspec: containers: - name: nginx image: nginx livenessProbe: exec: command: - cat - /tmp/health initialDelaySeconds: 30 # 初始化时间 successThreshold: 1 # 连续成功多少次算成功 failureThreshold: 3 # 连续失败几次算失败 timeoutSeconds: 2 # 探测超时时间 periodSeconds: 2 # 执行探测等频率,单位秒。默认10秒,最小1TCPSocket:相当于ping
apiVersion: v1kind: Podmetadata: name: probe-tcp namespace: defaultspec: containers: - name: nginx image: nginx livenessProbe: tcpSocket: port: 80 initialDelaySeconds: 30 # 初始化时间 successThreshold: 1 # 连续成功多少次算成功 failureThreshold: 3 # 连续失败几次算失败 timeoutSeconds: 2 # 探测超时时间 periodSeconds: 2 # 执行探测等频率,单位秒。默认10秒,最小1HTTPGet:相当于http请求服务内部的接口
apiVersion: v1kind: Podmetadata: name: probe-http namespace: defaultspec: containers: - name: nginx image: nginx livenessProbe: httpGet: path: /ping port: 80 scheme: HTTP initialDelaySeconds: 30 # 初始化时间 successThreshold: 1 # 连续成功多少次算成功 failureThreshold: 3 # 连续失败几次算失败 timeoutSeconds: 2 # 探测超时时间 periodSeconds: 2 # 执行探测等频率,单位秒。默认10秒,最小1存活性:livenessProbe就绪性:readinessProbe健康检查方式2种:1.存活性探测:检查容器是否正常运行2.就绪性探测:检查容器是否能够对外提供服务两者维度不一样两者处理方式不一样: 存活性检查失败:把容器删掉 就绪性检查失败:移除集群(移除负载均衡)就绪性探测3种方式:1.ExecAction:在容器内执行指定的命令。看执行成功与否2.TCPSocketAction:对指定端口上Pod的IP地址执行TCP检查。相当于ping3.HTTPGetAction:GET在指定的端口和路径上针对Pod的IP地址执行HTTP请求。相当于http请求服务内部的接口,一般服务内部创建一个ping路由。详细使用:https://www.cnblogs.com/guyouyin123/p/15604212.html
污点:被打上污点Taints的node节点,不会被调度器部署pod应用。容忍:允许调度器部署pod应用到打上污点Taints的节点。污点作用:比如master节点不想部署那么多的pod,因为不能让master节点压力太大。那么给master节点打上污点标签,pod就不会部署到该节点了污点容忍:比如master节点打上污点了,但是想要部署其中一个pod到master上,那么就需要在pod配置清单中写入容忍污点。参数:NoSchedule: 不调度到污点节点上去PreferNoSchedule:NoSchedule 的软策略版本,表示尽量不调度到污点节点上去NoExecute:该选项意味着一旦Taint生效,如该节点内正在运行的pod没有对应Tolerate设置,会直接被逐出节点标记污点:
kubectl taint node sg-14 test=sg14:PreferNoSchedule
容忍污点:
apiVersion: apps/v1kind: Deploymentmetadata: name: deploymentspec: replicas: 1 # pod数量 selector: # 选择器 matchLabels: # 标签 release: stable # 选择标签 template: # 模版 metadata: name: test-tag # 控制器名字 labels: release: stable # 设置控制器标签 spec: containers: - name: nginx # 镜像名称 image: nginx # 镜像 tolerations: - key: "node-role.kubernetes.io/master" operator: "Exists" effect: "NoSchedule"详细教程:https://www.cnblogs.com/guyouyin123/p/15666274.html
hpa可以根据指标,来弹性增加删除pod的副本数。控制pod配置清单的replicas参。参数:minReplicas: 最小pod实例数maxReplicas: 最大pod实例数metrics: 用于计算所需的Pod副本数量的指标列表resource: 核心指标,包含cpu和内存两种(被弹性伸缩的pod对象中容器的requests和limits中定义的指标。)object: k8s内置对象的特定指标(需自己实现适配器)pods: 应用被弹性伸缩的pod对象的特定指标(例如,每个pod每秒处理的事务数)(需自己实现适配器)external: 非k8s内置对象的自定义指标(需自己实现适配器)案例:
apiVersion: autoscaling/v2beta1 #(支持cpu,memory,及自定义)kind: HorizontalPodAutoscalermetadata: name: bikesvc namespace: sg-bsspec: minReplicas: 1 maxReplicas: 10 scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: bikesvc metrics: - type: Resource resource: name: memory # 内存占用率(百分比) targetAverageUtilization: 80 - type: Resource resource: name: cpu # cpu占用率(百分比) targetAverageUtilization: 80k8s的服务注册是通过service实现的。pod服务在启动成功后,会加载service信息。流量调度:ingress-->service-->pod查看标签:
kubectl get pod --show-labels创建标签,标签选择器:
replicas: 1 决定pod部署的数量Deploymnet:在Deployment对象中描述所需的状态,然后Deployment控制器将实际状态以受控的速率更改为所需的状态。apiVersion: apps/v1kind: Deploymentmetadata: name: deploymentspec: replicas: 1 # pod数量 selector: # 选择器 matchLabels: # 标签选择器 release: stable # 选择标签 template: # 模版 metadata: name: test-tag # 控制器名字 labels: release: stable # 设置控制器标签 spec: containers: - name: nginx # 镜像名称 image: nginx # 镜像cicd执行
1.代码打包镜像2.镜像上传仓库3.编写配置清单(ingress,service,nameSpace,Deployment)4.应用部署清单,kubectl apply -f 清单路径实现一个logservice服务两种方式:1.kafka方式缺点:需要依赖于kafka优点:数据不会缺失。需要考虑的点:日志量大之后,是否影响业务服务。是否需要在k8s外面额外部署一个kafka服务。所以不建议2.使用udp方式实现一个udp服务端服务,再全局初始化一个客户端udp服务。缺点:有可能日志数据丢失(内网不稳定情况)优点:只依赖于网络,扩展性高。自己编写代码实现udp服务端,可以做一些限制。比如保存时常,或者udp日志数据包太长拦截掉。(很明显不是日志信息,而是业务数据信息)Promethus1、为每个pod设置资源限制2、设置Kubelet资源预留