一. Kubernetes操作
首先我们要了解Kubernetes在运行我们的资源时,关联到了哪些内容:
资源的构建方式:
- 采用kubectl的命令方式
- yaml文件方式
1.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
1.2 Pod
Pod:Kubernetes运行的一组容器,Pod是Kubernetes的最小单位,但是对于Docker而然,Pod中会运行多个Docker容器:
命令方式:
# 查看所有运行的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方式:(推荐)
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: 容器名称 …………
启动后可以查看到:
图形化页面修改
1.3 Deployment
部署时,可以通过Deployment管理和编排Pod。
Deployment部署实现:
命令方式:
# 基于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 集群个数
配置文件方式:
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即可。
弹性伸缩功能:
# 基于scale实现弹性伸缩 kubectl scale deploy/Deployment名称 --replicas 集群个数 # 或者修改yaml文件 kubectl edit deploy Deployment名称
图形化页面修改
灰度发布:
Deploy可以在部署新版本数据时,成功启动一个pod,才会下线一个老版本的Pod。
kubectl set image deployment/Deployment名称 容器名=镜像:版本
1.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,即可访问:
kubectl get service
也可以通过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 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信息
1.5 Ingress
Kubernetes推荐将Ingress作为所有Service的入口,提供统一的入口,避免多个服务之间需要记录大量的IP或者域名,毕竟IP可能改变,服务太多域名记录不方便。
Ingress底层其实就是一个Nginx, 可以在Kuboard上直接点击安装:
Kuboard安装
因为副本数默认为1,但是k8s整体集群就2个节点,所以显示下面即为安装成功。
安装成功
可以将Ingress接收到的请求转发到不同的Service中。
推荐使用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
启动时问题
Kuboard安装的Ingress有admission的校验配置,需要先删除配置再启动。
找到指定的ingress的校验信息,删除即可:
删除信息
# 查看校验webhook的配置 kubectl get -A ValidatingWebhookConfiguration # 删除指定的校验 kubectl delete ValidatingWebhookConfiguration ingress-nginx-admission-my-ingress-controller
配置本地hosts文件
配置hosts
记下来既可以访问在Service中暴露的Nginx信息:
服通过Ingress访问