企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] ## Kubernetes操作 首先我们要了解Kubernetes在运行我们的资源时,资源的构建方式: * 采用kubectl的命令方式 * yaml文件方式 ### Namespace * 命名空间:主要是为了对Kubernetes中运行的资源进行过隔离, 但是网络是互通的,类似Docker的容器,可以将多个资源配置到一个NameSpace中。而NameSpace可以对不同环境进行资源隔离,默认情况下Kubernetes提供了default命名空间,在构建资源时,如果不指定资源,默认采用default资源。 命令方式: ```sh # 查看现有的全部命名空间 kubectl get ns # 构建命名空间 kubectl create ns 命名空间名称 # 删除现有命名空间, 并且会删除空间下的全部资源 kubectl delete ns 命名空间名称 ``` yaml文件方式:(构建资源时,设置命名空间) ```yaml apiVersion: v1 kind: Namespace metadata: name: test ``` ### Pod * Pod:Kubernetes运行的一组容器,Pod是Kubernetes的最小单位,但是对于Docker而然,Pod中会运行多个Docker容器 * 命令方式: ```bash # 查看所有运行的pod kubectl get pods -A # 查看指定Namespace下的Pod kubectl get pod [-n 命名空间] #(默认default) # 创建Pod kubectl run pod名称 --image=镜像名称 # 查看Pod详细信息 kubectl describe pod pod名称 # 删除pod kubectl delete pod pod名称 [-n 命名空间] #(默认default) # 查看pod输出的日志 kubectl logs -f pod名称 # 进去pod容器内部 kubectl exec -it pod名称 -- bash # 查看kubernetes给Pod分配的ip信息,并且通过ip和容器的端口,可以直接访问 kubectl get pod -owide ``` * yaml方式(推荐) ```yaml apiVersion: v1 kind: Pod metadata: labels: run: 运行的pod名称 name: pod名称 namespace: 命名空间 spec: containers: - image: 镜像名称 name: 容器名称 # 启动Pod:kubectl apply -f yaml文件名称 # 删除Pod:kubectl delete -f yaml文件名称 ``` * Pod中运行多个容器 ```yml apiVersion: v1 kind: Pod metadata: labels: run: 运行的pod名称 name: pod名称 namespace: 命名空间 spec: containers: - image: 镜像名称 name: 容器名称 - image: 镜像名称 name: 容器名称 ``` 启动后可以查看到 | Kuboard效果 | | :----------------------------------------------------------: | | ![](https://img.kancloud.cn/75/89/75897917599974c3d3de9e06e250002b_1917x963.png) | ### Deployment 部署时,可以通过Deployment管理和编排Pod Deployment部署实现 - 命令方式 ```sh # 基于Deployment启动容器 kubectl create deployment deployment名称 --image=镜像名称 # 用deployment启动的容器会在被删除后自动再次创建,达到故障漂移的效果 # 需要使用deploy的方式删除deploy # 查看现在的deployment kubectl get deployment # 删除deployment kubectl delete deployment deployment名称 # 基于Deployment启动容器并设置Pod集群数 kubectl create deployment deployment名称 --image=镜像名称 --replicas 集群个数 ``` - [配置文件方式](https://kubernetes.io/zh/docs/concepts/workloads/controllers/deployment/) ```yml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 ``` 正常使用kubectl运行yaml即可 弹性伸缩功能 ```sh # 基于scale实现弹性伸缩 kubectl scale deploy/Deployment名称 --replicas 集群个数 # 或者修改yaml文件 kubectl edit deploy Deployment名称 ``` | 图形化页面修改 | | :----------------------------------------------------------: | | ![](https://img.kancloud.cn/db/6d/db6d66d9f49f07f5ab7c3eb30924d451_1918x795.png)| 灰度发布 Deploy可以在部署新版本数据时,成功启动一个pod,才会下线一个老版本的Pod ```shell kubectl set image deployment/Deployment名称 容器名=镜像:版本 ``` ### Service 可以将多个Pod对外暴露一个Service,让客户端可以通过Service访问到这一组Pod,并且可以实现负载均衡 ClusterIP方式: ClusterIP是集群内部Pod之间的访问方式 - 命令实现效果 ```sh # 通过生成service映射一个Deployment下的所有pod中的某一个端口的容器 kubectl expose deployment Deployment名称 --port=Service端口号 --target-port=Pod内容器端口 ``` 之后通过`kubectl get service`查看Service提供的ip,即可访问 | kubectl get service | | :----------------------------------------------------------: | | ![](https://img.kancloud.cn/66/14/66148ef145477314f7e038f85f96b0b9_866x263.png) | 也可以通过`Deployment名称.namespace名称.svc`作为域名访问 | 在服务容器内执行 | | :----------------------------------------------------------: | | ![](https://img.kancloud.cn/5f/70/5f70848d6f9cde40b996898035829309_980x259.png) | NodePort方式 ClusterIP的方式只能在Pod内部实现访问,但是一般需要对外暴露网关,所以需要NodePort的方式Pod外暴露访问 - 命令实现方式 ```sh # 通过生成service映射一个Deployment下的所有pod中的某一个端口的容器 kubectl expose deployment Deployment名称 --port=Service端口号 --target-port=Pod内容器端口 --type=NodePort ``` | 查看Service效果 | | :----------------------------------------------------------: | | ![](https://img.kancloud.cn/18/bd/18bd1ef013f4aa1ab68985ffca5edc1d_1345x172.png) | | ![](https://img.kancloud.cn/de/73/de73371db0b28e074121bcda8bf1814e_812x170.png)| Service也可以通过yaml文件实现 ```yaml apiVersion: v1 kind: Service metadata: labels app: nginx name: nginx spec: selector: app: nginx ports: - port: 8888 protocol: TCP targetPort: 80 ``` 通过apply启动就也可以创建Service 测试效果-Deployment部署,通过Service暴露 ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx-deployment spec: replicas: 2 selector: matchLabels: app: nginx-deployment template: metadata: labels: app: nginx-deployment spec: containers: - name: nginx-deployment image: nginx ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: labels: app: nginx-service name: nginx-service spec: selector: app: nginx-deployment ports: - port: 8888 protocol: TCP targetPort: 80 type: NodePort ``` 可以查看到暴露的信息 | Service信息 | | :----------------------------------------------------------: | |![](https://img.kancloud.cn/4a/38/4a387b6520bbf8258f676f09a9332c5b_907x93.png)| ### Ingress Kubernetes推荐将Ingress作为所有Service的入口,提供统一的入口,避免多个服务之间需要记录大量的IP或者域名,毕竟IP可能改变,服务太多域名记录不方便。 Ingress底层其实就是一个Nginx, 可以在Kuboard上直接点击安装 | Kuboard安装 | | :----------------------------------------------------------: | | ![](https://img.kancloud.cn/0c/67/0c67bd3fbfbf4c0967217161383135ad_1917x566.png) | | ![](https://img.kancloud.cn/a4/32/a432443dc9c54207c519595b9cb1ecdd_1860x740.png) | 因为副本数默认为1,但是k8s整体集群就2个节点,所以显示下面即为安装成功 | 安装成功 | | :----------------------------------------------------------: | | ![](https://img.kancloud.cn/db/bd/dbbde90380d50defb5d18b66f9e99dfb_1902x862.png) | 可以将Ingress接收到的请求转发到不同的Service中。 推荐使用yaml文件方式 ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx-ingress spec: ingressClassName: ingress rules: - host: nginx.mashibing.com http: paths: - path: / pathType: Prefix backend: service: name: nginx-service port: number: 8888 ``` | 启动时问题 | | :----------------------------------------------------------: | | ![](https://img.kancloud.cn/66/50/6650adcc9545ced2c16fcc7373b3832e_1876x114.png) | Kuboard安装的Ingress有admission的校验配置,需要先删除配置再启动 找到指定的ingress的校验信息,删除即可 | 删除信息 | | :----------------------------------------------------------: | | ![](https://img.kancloud.cn/c2/7f/c27f4ce18d92ad0c231b982f82b80963_1413x180.png) | ```sh # 查看校验webhook的配置 kubectl get -A ValidatingWebhookConfiguration # 删除指定的校验 kubectl delete ValidatingWebhookConfiguration ingress-nginx-admission-my-ingress-controller ``` 配置本地hosts文件 | 配置hosts | | :----------------------------------------------------------: | | ![](https://img.kancloud.cn/36/b5/36b566aa81e32cfaec02840cf77a1585_1117x539.png) | 记下来既可以访问在Service中暴露的Nginx信息 | 服通过Ingress访问 | | :----------------------------------------------------------: | | ![](https://img.kancloud.cn/5f/64/5f64761762042aa5c75fdbfce9c06f32_779x148.png) |