K8S指令练习

# K8S的指令练习 ## 查看所有节点的 ```kubernetes kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready master 10h v1.17.3 k8s-node1 Ready <none> 9h v1.17.3 k8s-node2 Ready <none> 9h v1.17.3 ``` ## 创建一个Pod ### 创建一个deployment ```kubernetes kubectl create deployment [部署名称] --image=[镜像名称] ``` > **如果我们创建一个deployment, 那么会自动创建对应的pod** ### 删除一个deployment ```kubernetes kubectl delete deployment [部署名称] ``` ### 查看当前命名空间pod状态详情 ```kubernetes kubectl get nodes -o wide ``` > **注意, 如果用上面的指令创建一个部署, 最终, 这个部署只会创建一个pod副本, 即最终只会有一个pod** ### 获取所有的信息 ```kubernetes kubectl get all ``` ### 模拟Node节点的Docker进程异常结束 ![image.png](https://cos.easydoc.net/13568421/files/lmy5k8sr.png) > 可以看出, 当docker被关闭时, kubernetes会快速容灾恢复, 重新启动docker ### 模拟Node节点宕机 ![image.png](https://cos.easydoc.net/13568421/files/lmy5ucaf.png) > 因为默认情况下, 我们维护的pod副本数是1, 当node-1节点宕机的时候, 上面的副本不可用, 整个集群需要维护一个副本, 因此在node-2节点创建一个副本 > **这体现了容灾的快速恢复, 当检测到某个节点的pod不可用时, 在另一个节点重新拉取一个** > <font color="red">**注意: 这个过程需要5-6分钟**</font> ### 模拟Node节点恢复 ![image.png](https://cos.easydoc.net/13568421/files/lmy5zxp4.png) > 这个重新被拉起来的Node节点, 发现里面已经被有了之前的容器, 这是因为维护副本总量的原因, node-2已经有了, node-1不需要了 ## 暴露Nginx访问 ```kubernetes kubectl expose deployment tomcat6 --port=80 --target-port=8080 --type=NodePort ``` ![image.png](https://cos.easydoc.net/13568421/files/lmy6ddbw.png) ### 具体的映射关系 > **因为service的作用就是对外暴露pod, 因此service的31473端口号映射着pod的80端口号, 而pod的80端口号又映射着docker容器里面的tomcat的8080端口号** > **因此, 我们访问31473端口号就可以访问容器了** ## 扩容副本 ```kubernetes kubectl scale --replicas=[副本数量] deployment [部署名] ``` > 相当于对这个部署扩容副本(我这里写了副本数=3) ![image.png](https://cos.easydoc.net/13568421/files/lmy6vt80.png) ![image.png](https://cos.easydoc.net/13568421/files/lmy6w2kc.png) ### 缩容副本 ![image.png](https://cos.easydoc.net/13568421/files/lmy6yhzj.png) ![image.png](https://cos.easydoc.net/13568421/files/lmy6ym9x.png) ![image.png](https://cos.easydoc.net/13568421/files/lmy6yr5j.png) ## 删除 ```kubernetes kubectl delete [service | deployment | pot] [名称] ``` > **如果我们删除了deployment, 对应的pod也会被自动删除, pod对应的容器也会被自动删除!** # kubectl文档 [**官方文档**](https://kubernetes.io/zh-cn/docs/reference/kubectl/) ## 测试yaml输出 ```kubernetes kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8 --dry-run=true -o yaml ``` > `--dry-run=true`: 有这个参数, 这个指令只会被执行, 不会被输出, 可以省去我们删除的步骤 > `-o yaml`: 以yaml的形式输出 ```yaml apiVersion: apps/v1 # 版本号 kind: Deployment # 操作的类型 metadata: creationTimestamp: null # 元数据信息 创建时间戳 labels: app: tomcat6 # 标签 name: tomcat6 # 部署名 spec: # 具体操作 replicas: 1 # 副本数(这就是为什么默认只有一个副本的原因) selector: matchLabels: app: tomcat6 strategy: {} template: metadata: creationTimestamp: null labels: app: tomcat6 spec: containers: - image: tomcat:6.0.53-jre8 name: tomcat resources: {} status: {} ``` ## 查看pod的yaml信息 ```kubernetes kubectl get pod tomcat6-5f7ccf4cb9-b2d9c -o yaml ``` ```yaml apiVersion: v1 kind: Pod metadata: creationTimestamp: "2023-09-25T01:29:24Z" generateName: tomcat6-5f7ccf4cb9- labels: app: tomcat6 pod-template-hash: 5f7ccf4cb9 name: tomcat6-5f7ccf4cb9-b2d9c namespace: default ownerReferences: - apiVersion: apps/v1 blockOwnerDeletion: true controller: true kind: ReplicaSet name: tomcat6-5f7ccf4cb9 uid: 96445dc7-cf92-4b8d-be7a-ef2e91782dcc resourceVersion: "26637" selfLink: /api/v1/namespaces/default/pods/tomcat6-5f7ccf4cb9-b2d9c uid: cd2aaf2c-4fee-4f70-8696-454842255051 spec: containers: - image: tomcat:6.0.53-jre8 imagePullPolicy: IfNotPresent name: tomcat resources: {} terminationMessagePath: /dev/termination-log terminationMessagePolicy: File volumeMounts: - mountPath: /var/run/secrets/kubernetes.io/serviceaccount name: default-token-clzzt readOnly: true dnsPolicy: ClusterFirst enableServiceLinks: true nodeName: k8s-node1 priority: 0 restartPolicy: Always schedulerName: default-scheduler securityContext: {} serviceAccount: default serviceAccountName: default terminationGracePeriodSeconds: 30 tolerations: - effect: NoExecute key: node.kubernetes.io/not-ready operator: Exists tolerationSeconds: 300 - effect: NoExecute key: node.kubernetes.io/unreachable operator: Exists tolerationSeconds: 300 volumes: - name: default-token-clzzt secret: defaultMode: 420 secretName: default-token-clzzt status: conditions: - lastProbeTime: null lastTransitionTime: "2023-09-25T01:29:24Z" status: "True" type: Initialized - lastProbeTime: null lastTransitionTime: "2023-09-25T01:29:25Z" status: "True" type: Ready - lastProbeTime: null lastTransitionTime: "2023-09-25T01:29:25Z" status: "True" type: ContainersReady - lastProbeTime: null lastTransitionTime: "2023-09-25T01:29:24Z" status: "True" type: PodScheduled containerStatuses: - containerID: docker://61e638040fdda1098b3d3c3ef9575396a5f0835bbd555645c936ec344569d61b image: tomcat:6.0.53-jre8 imageID: docker-pullable://tomcat@sha256:8c643303012290f89c6f6852fa133b7c36ea6fbb8eb8b8c9588a432beb24dc5d lastState: {} name: tomcat ready: true restartCount: 0 started: true state: running: startedAt: "2023-09-25T01:29:25Z" hostIP: 192.168.10.143 phase: Running podIP: 10.244.1.5 podIPs: - ip: 10.244.1.5 qosClass: BestEffort startTime: "2023-09-25T01:29:24Z" ``` ### 通过yaml创建一个具有多个容器的pod ```yaml apiVersion: v1 kind: Pod metadata: labels: app: pp name: pp namespace: default spec: containers: - image: tomcat:6.0.53-jre8 name: tomcat - image: nginx name: nginx ``` ## 以Yaml的形式部署 ```kubernetes kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre -o yml > kube-pod-yml ``` ### 同时部署多个Pods ```yaml apiVersion: v1 kind: Pod metadata: labels: app: p1 name: p1 namespace: default spec: containers: - image: tomcat:6.0.53-jre8 name: tomcat --- apiVersion: v1 kind: Pod metadata: labels: app: p2 name: p2 namespace: default spec: containers: - image: tomcat:6.0.53-jre8 name: tomcat ``` ```kubernetes kubectl expose deployment [部署名] --port=? --target-port=? --type=NodePort ``` > **注意`---`可以区分多个代码片段, 这个相当于Java中的分号** ## 部署ingress ```yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: name: web spec: rules: - host: tomcat6.atguigu.com http: paths: - backend: serviceName: tomcat6 servicePort: 80 ``` > 上面这串东西的意思是, 创建一个ingress, 里面的路由规则是, 如果遇到域名 `tomcat6.atguigu.com`, 则路由到service名字叫tomcat6的service上, 对应的service端口号是80, 然后对卡里面的pods负载均衡