10.4 Kubernetes操作
首先我们要了解Kubernetes在运行我们的资源时,关联到了哪些内容
- 资源的构建方式:
- 采用kubectl的命令方式
- yaml文件方式
10.4.1 Namespace
- 命名空间:主要是为了对Kubernetes中运行的资源进行过隔离, 但是网络是互通的,类似Docker的容器,可以将多个资源配置到一个NameSpace中。而NameSpace可以对不同环境进行资源隔离,默认情况下Kubernetes提供了default命名空间,在构建资源时,如果不指定资源,默认采用default资源。
命令方式:
# 查看现有的全部命名空间 kubectl get ns # 创建命名空间 kubectl create ns 命名空间名称 # 删除现有命名空间, 并且会删除空间下的全部资源 kubectl delete ns 命名空间名称
yaml文件方式:(构建资源时,设置命名空间)
apiVersion: v1 kind: Namespace metadata: name: test
10.4.2 Pod
- Pod:Kubernetes运行的一组容器,Pod是Kubernetes的最小单位,但是对于Docker而然,Pod中会运行多个Docker容器
- 命令方式:
# 查看所有命名空间下运行的pod,不加-A表示default命名空间下 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方式(推荐)
**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中运行多个容器
**apiVersion: v1 kind: Pod metadata: labels: run: 运行的pod名称 name: pod名称 namespace: 命名空间 spec: containers: - image: 镜像名称 name: 容器名称 - image: 镜像名称 name: 容器名称 …………**
# 部署一个nginx-tomcat的pod,一个pod中可以运行多个容器 apiVersion: v1 kind: Pod metadata: name: nginx-tomcat namespace: test spec: containers: - image: nginx name: nginx - image: tomcat name: tomcat
启动后可以查看到
Kuboard效果:
10.4.3 Deployment
部署时,可以通过Deployment管理和编排Pod
Deployment部署实现
命令方式:
# 基于Deployment启动容器 kubectl create deployment deployment名称 --image=镜像名称 # ex:在test命名空间下创建一个deployment类型的pod kubectl create deployment deploy-nginx --image=nginx -n test # 用deployment启动的容器会在被删除后自动再次创建,达到故障漂移的效果 # 需要使用deploy的方式删除deploy # 查看现在的deployment kubectl get deployment # 删除deployment kubectl delete deployment deployment名称 # ex:删除test命名空间下的pod:deploy-nginx kubectl delete pod deploy-nginx --image=nginx -n test # 基于Deployment启动容器并设置Pod副本数 kubectl create deployment deployment名称 --image=镜像名称 --replicas 集群个数
配置文件方式:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment namespace: test 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 apply -f deployment-nginx.yml
正常使用kubectl运行yaml即可
弹性伸缩功能
# 基于scale实现弹性伸缩 kubectl scale deploy/Deployment名称 --replicas 集群个数 # 或者修改yaml文件 kubectl edit deploy Deployment名称
图形化页面修改:
灰度发布
Deploy可以在部署新版本数据时,成功启动一个pod,才会下线一个老版本的Pod
kubectl set image deployment/Deployment名称 容器名=镜像:版本
10.4.4 Service
可以将多个Pod对外暴露一个Service,让客户端可以通过Service访问到这一组Pod,并且可以实现负载均衡
ClusterIP方式:
ClusterIP是集群内部Pod之间的访问方式
命令实现效果:
# 通过生成service映射一个Deployment下的所有pod中的某一个端口的容器 kubectl expose deployment Deployment名称 --port=Service端口号 --target-port=Pod内容器端口
之后通过kubectl get service
查看Service提供的ip,即可访问
也可以通过Deployment名称.namespace名称.svc
作为域名访问
在服务容器内执行:
NodePort方式:
ClusterIP的方式只能在Pod内部实现访问,但是一般需要对外暴露网关,所以需要NodePort的方式Pod外暴露访问
命令实现方式:
# 通过生成service映射一个Deployment下的所有pod中的某一个端口的容器 kubectl expose deployment Deployment名称 --port=Service端口号 --target-port=Pod内容器端口 --type=NodePort
查看Service效果:
Service也可以通过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对外暴露端口
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment namespace: test labels: app: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx-deployment namespace: test labels: app: nginx-deployment spec: selector: app: nginx ports: - port: 8888 protocol: TCP targetPort: 80 type: NodePort
可以查看到暴露的信息
10.4.5 Ingress
Kubernetes推荐将Ingress作为所有Service的入口,提供统一的入口,避免多个服务之间需要记录大量的IP或者域名,毕竟IP可能改变,服务太多域名记录不方便。
Ingress底层其实就是一个Nginx, 可以在Kuboard上直接点击安装:
因为副本数默认为1,但是k8s整体集群就2个节点,所以显示下面即为安装成功
可以将Ingress接收到的请求转发到不同的Service中。
推荐使用yaml文件方式
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx-ingress namespace: test spec: ingressClassName: ingress rules: - host: nginx.ingress.com http: paths: - path: / pathType: Prefix backend: service: name: nginx-deployment port: number: 8888
启动时问题:
Kuboard安装的Ingress有admission的校验配置,需要先删除配置再启动
找到指定的ingress的校验信息,删除即可
# 查看校验webhook的配置 kubectl get -A ValidatingWebhookConfiguration # 删除指定的校验 kubectl delete ValidatingWebhookConfiguration ingress-nginx-admission-my-ingress-controller
配置本地hosts文件:
接下来就可以访问在Service中暴露的Nginx信息
注意:必须是域名+IP才能访问,只用域名访问会报错。