【云原生】Kubernetes操作精讲
一. 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访问 |
---|
- 点赞
- 收藏
- 关注作者
评论(0)