写点什么

K8S 太火了!花 10 分钟玩转它不香么?

  • 2022 年 4 月 18 日
  • 本文字数:3650 字

    阅读完需:约 12 分钟

kubectl get nodes


NAME STATUS ROLES AGE VERSIONminikube Ready control-plane,master 46m v1.20.0

部署应用

一旦运行了 K8S 集群,就可以在其上部署容器化应用程序。通过创建 Deployment 对象,可以指挥 K8S 如何创建和更新应用程序的实例。


  • 指定好应用镜像并创建一个 Deployment,这里创建一个 Nginx 应用:


kubectl create deployment kubernetes-nginx --image=nginx:1.10


  • 创建一个 Deployment 时 K8S 会产生如下操作:

  • 选择一个合适的 Node 来部署这个应用;

  • 将该应用部署到 Node 上;

  • 当应用异常关闭或删除时重新部署应用。

  • 查看所有 Deployment:


kubectl get deployments


NAME READY UP-TO-DATE AVAILABLE AGEkubernetes-nginx 1/1 1 1 21h


  • 我们可以通过kubectl proxy命令创建一个代理,这样就可以通过暴露出来的接口直接访问 K8S 的 API 了,这里调用了查询 K8S 版本的接口;


[macro@linux-local root]$ kubectl proxyStarting to serve on 127.0.0.1:8001[root@linux-local ~]# curl http://localhost:8001/version{"major": "1","minor": "20","gitVersion": "v1.20.0","gitCommit": "af46c47ce925f4c4ad5cc8d1fca46c7b77d13b38","gitTreeState": "clean","buildDate": "2020-12-08T17:51:19Z","goVersion": "go1.15.5","compiler": "gc","platform": "linux/amd64"}

查看应用

通过对运行应用的 Pod 进行操作,可以查看容器日志,也可以执行容器内部命令。


  • 查看 K8s 中所有 Pod 的状态:


kubectl get pods


NAME READY STATUS RESTARTS AGEkubernetes-nginx-78bcc44665-8fnnn 1/1 Running 1 21h


  • 查看 Pod 的详细状态,包括 IP 地址、占用端口、使用镜像等信息;


kubectl describe pods


Name: kubernetes-nginx-78bcc44665-8fnnnNamespace: defaultPriority: 0Node: minikube/192.168.49.2Start Time: Tue, 05 Jan 2021 13:57:46 +0800Labels: app=kubernetes-nginxpod-template-hash=78bcc44665version=v1Annotations: <none>Status: RunningIP: 172.17.0.7IPs:IP: 172.17.0.7Controlled By: ReplicaSet/kubernetes-nginx-78bcc44665Containers:nginx:Container ID: docker://31eb1277e507ec4cf8a27b66a9f4f30fb919d17f4cd914c09eb4cfe8322504b2Image: nginx:1.10Image ID: docker-pullable://nginx@sha256:6202beb06ea61f44179e02ca965e8e13b961d12640101fca213efbfd145d7575Port: <none>Host Port: <none>State: RunningStarted: Wed, 06 Jan 2021 09:22:40 +0800Last State: TerminatedReason: CompletedExit Code: 0Started: Tue, 05 Jan 2021 14:24:55 +0800Finished: Tue, 05 Jan 2021 17:32:48 +0800Ready: TrueRestart Count: 1Environment: <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from default-token-dhr4b (ro)Conditions:Type StatusInitialized TrueReady TrueContainersReady TruePodScheduled TrueVolumes:default-token-dhr4b:Type: Secret (a volume populated by a Secret)SecretName: default-token-dhr4bOptional: falseQoS Class: BestEffortNode-Selectors: <none>Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300 Java 开源项目【ali1024.coding.net/public/P7/Java/git】 sEvents: <none>复制代码


  • 将 Pod 的名称设置为环境变量,方便之后使用$POD_NAME来应用 Pod 的名称:


export POD_NAME=kubernetes-nginx-78bcc44665-8fnnn


  • 查看 Pod 打印的日志:


kubectl logs $POD_NAME


  • 使用exec可以在 Pod 的容器中执行命令,这里使用env命令查看环境变量:


kubectl exec $POD_NAME -- env 复制代码


PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binHOSTNAME=kubernetes-nginx-78bcc44665-8fnnnKUBERNETES_PORT_443_TCP_ADDR=10.96.0.1KUBERNETES_SERVICE_HOST=10.96.0.1KUBERNETES_SERVICE_PORT=443KUBERNETES_SERVICE_PORT_HTTPS=443KUBERNETES_PORT=tcp://10.96.0.1:443KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443KUBERNETES_PORT_443_TCP_PROTO=tcpKUBERNETES_PORT_443_TCP_PORT=443NGINX_VERSION=1.10.3-1~jessieHOME=/root


  • 进入容器内部并执行bash命令,如果想退出容器可以使用exit命令:


kubectl exec -ti $POD_NAME -- bash

公开暴露应用

默认 Pod 无法被集群外部访问,需要创建 Service 并暴露端口才能被外部访问。


  • 创建一个 Service 来暴露 kubernetes-nginx 这个 Deployment:


kubectl expose deployment/kubernetes-nginx --type="NodePort" --port 80


  • 查看 K8S 中所有 Service 的状态:


kubectl get services 复制代码


NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5h16mkubernetes-nginx NodePort 10.105.177.114 <none> 80:31891/TCP 5s


  • 查看 Service 的详情,通过NodePort属性可以得到暴露到外部的端口;


kubectl describe services/kubernetes-nginx


Name: kubernetes-nginxNamespace: defaultLabels: app=kubernetes-nginxAnnotations: <none>Selector: app=kubernetes-nginxType: NodePortIP Families: <none>IP: 10.106.227.54IPs: 10.106.227.54Port: <unset> 80/TCPTargetPort: 80/TCPNodePort: <unset> 30158/TCPEndpoints: 172.17.0.7:80Session Affinity: NoneExternal Traffic Policy: ClusterEvents: <none>


  • 通过 CURL 命令通过Minikube IP:NodePort IP可以访问 Nginx 服务,此时将打印 Nginx 主页信息;


curl $(minikube ip):30158


<!DOCTYPE html><html><head><title>Welcome to nginx!</title><style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;}</style></head><body><h1>Welcome to nginx!</h1><p>If you see this page, the nginx web server is successfully installed andworking. Further configuration is required.</p>


<p>For online documentation and support please refer to<a href="http://nginx.org/">nginx.org</a>.<br/>Commercial support is available at<a href="http://nginx.com/">nginx.com</a>.</p>


<p><em>Thank you for using nginx.</em></p></body></html>

标签的使用

通过给资源添加 Label,可以方便地管理资源(如 Deployment、Pod、Service 等)。


  • 查看 Deployment 中所包含的 Label;


kubectl describe deployment


Name: kubernetes-nginxNamespace: defaultCreationTimestamp: Tue, 05 Jan 2021 13:57:46 +0800Labels: app=kubernetes-nginxAnnotations: deployment.kubernetes.io/revision: 1Selector: app=kubernetes-nginxReplicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailableStrategyType: RollingUpdateMinReadySeconds: 0RollingUpdateStrategy: 25% max unavailable, 25% max surge


  • 通过 Label 查询 Pod:


kube 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》开源 ctl get pods -l app=kubernetes-nginx


NAME READY STATUS RESTARTS AGEkubernetes-nginx-78bcc44665-8fnnn 1/1 Running 1 21h


  • 通过 Label 查询 Service:


kubectl get services -l app=kubernetes-nginx


NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes-nginx NodePort 10.106.227.54 <none> 80:30158/TCP 4m44s


  • 给 Pod 添加 Label:


kubectl label pod $POD_NAME version=v1


  • 查看 Pod 的详细信息,可以查看 Label 信息:


kubectl describe pods $POD_NAME


Name: kubernetes-nginx-78bcc44665-8fnnnNamespace: defaultPriority: 0Node: minikube/192.168.49.2Start Time: Tue, 05 Jan 2021 13:57:46 +0800



最近我根据上述的技术体系图搜集了几十套腾讯、头条、阿里、美团等公司 21 年的面试题,把技术点整理成了视频(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分



用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
K8S太火了!花10分钟玩转它不香么?_Java_爱好编程进阶_InfoQ写作平台