k8s实战操作
▶ Namespace
• 概念和作用
Namespace是k8s系统中的一种非常重要的资源,它用来隔离Pod,一个命名空间下有多个Pod,不同命名空间内的Pod互相隔离。
• 默认namespace(不可删除)
▪ default:所有未指定Namespace的对象都会被分配在default命名空间
▪ kube-node-lease:集群节点之间的心跳维护
▪ kube-public:此命名空间下的资源可以被所有人访问
▪ kube-system:所有由k8s系统创建的资源都处于这个命名空间
• 具体命令操作
▪ 增
kubectl create namespace demo
▪ 删
kubectl delete namespace demo
▪ 改
kubectl edit ns demo
▪ 查
kubectl get ns
kubectl describe ns demo
• 资源清单方式
vim ns-demo.yaml
apiVersion: v1
kind: Namespace
metadata:
name: demo
执行命令:
创建:kubectl create -f ns-demo.yaml
删除:kubectl delete -f ns-demo.yaml
▶ Pod
• 概念
Pod是k8集群管理的最小单元,程序运行在容器中,而容器必须存在于Pod中
tpis:pause容器的作用是什么?
Pause容器负责创建并维护这个网络命名空间,其他容器共享这个网络命名空间,使它们能够相互通信,而不会与其他Pod中的容器发生冲突
• 具体命令操作
▪ 增
kubectl run nginx --image=nginx:1.17.1 --port=80 --namespace demo
▪ 删
kubectl -n demo delete pod 名称
▪ 改
kubectl -n demo edit pod 名称
▪ 查
查看pod基本信息:
kubectl -n demo get pods -o wide
查看pod的详细信息:
kubectl -n demo describe pod 名称
• 资源清单方式
vim pod-nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: demo
spec:
containers: #Pod的容器列表
- image: nginx:1.17.1 #- 代表第一个容器,拉取镜像nginx
name: pod #容器名
ports: #容器端口配置列表,声明容器内部监听哪些端口(仅声明)
- name: nginx-port #起一个端口名,Service通过端口名引用
containerPort: 80 #容器内部监听的端口号
protocol: TCP #端口协议
### ▶ Label
#### • 概念和作用
Label是k8s中的一个重要概念。它的作用就是在资源上添加标识,用来对它们进行区分和选择
• Label Selector
Label用于给某个资源对象定义标识
Label Selector用于查询和筛选拥有某些标签的资源对象
▪ 基于等式的Label Selector
name=salve
env!=production
▪ 基于集合的Label Selector
name in (master,slave)
name not in (frontend)
• 具体命令操作
▪ 增
kubectl -n demo label pod nginx-pod version=1.0
▪ 删
kubectl -n demo label pod nginx-pod version-
▪ 改
kubectl -n demo label pod nginx-pod version=2.0 --overwrite
▪ 查
查看标签:
kubectl -n demo get pod nginx-pod --show-labels
筛选标签:
kubectl -n demo get pod -l version=2.0 --show-labels
• 资源清单方式
vim labels.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: demo
labels:
version: 3.0
▶ Depolyment
• 概念和作用
在k8s中,Pod是最小的控制单元,但是k8s很少直接控制Pod,一般都是通过Pod控制器来完成的。Deployment就是一种Pod控制器。负责在Pod死掉的时候瞬间拉起一个新的补上。
• 具体命令操作
▪ 增
kubectl -n demo create deployment mydp --image nginx:1.17.1 --port 80 --replicas 3
▪ 删
kubectl -n demo delete deployment mydp
▪ 改
修改副本数:
kubectl -n demo scale deployment mydp --replicas 5
修改deployment:
kubectl -n demo edit deployment mydp
▪ 查
查看deployment:
kubectl -n demo get deployment
查看deployment的详细信息:
kubectl -n demo describe deployment mydp
查看depolyment创建的pod
kubectl -n demo get pods
查看NAME的前面,应该是mydp-xxxxx
• 资源清单方式
vim /deploy-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: demo
spec: #Deployment的期望状态
replicas: 3 #副本数
selector: #Deployment通过标签匹配管理哪些Pod
matchLabels: #标签匹配规则,之管理app:nginx的Pod
app: nginx #这里和下面的必须一样,不然报错
template: #Pod模板,创建Pod是,就按照这个模板生成
metadata: #模板内Pod的元数据
labels:
app: nginx #这里和上面的必须一样,不然报错
spec:
containers: #容器列表
.................
### ▶ Service
#### • 概念和作用
Service可以看作是一组同类Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。
• 具体命令操作
▪ 增
kubectl -n demo expose deploy nginx --name=svc-nginx -type=ClusterIP --port 80 --target-port 80
--port:Service自身的端口,集群其他服务访问它的端口
--target-port:后端Pod/容器上真实监听的端口
**type的四种类型:**
1.ClusterIP(默认):
仅集群内部可访问,集群外无法访问
k8s分配一个虚拟内网IP
场景:微服务之间互相调用
2.NodePort:
在每一台节点机器上打开一个端口(30000-32767范围)
外部可以通过节点IP:NodePort端口访问服务
集群内部仍然可以互相访问
场景:适合测试,不建议生产大规模使用
3.LoadBalancer:
需要云厂商支持
在NodePort的基础上,向云厂商申请公网负载均衡IP
用户直接访问公网LB的IP就可以到达服务
4.ExternalName:
不做端口代理
把Service映射倒一个外部域名,集群内访问svc,会CNAME解析到外部域名
没有port/target-port的端口转发,多用于访问外部第三方服务
▪ 删
kubectl -n demo delete svc svc-nginx
▪ 改
kubectl -n demo edit svc svc-nginx
▪ 查
kubectl -n demo get svc svc-nginx -o wide
• 资源清单方式
vim service.yaml
apiVersion: v1
kind: Service
metadata:
name: svc-nginx
namespace: demo
spec:
clusterIP:10.0.8.10
#手动指定IP的话要写,不指定的话不写这行,会自动分配
**#不能随便写,要看集群的service-cluster-ip-range地址池**
**常见默认网段:10.96.0.0/12(最常见)** **10.109.0.0/16 172.16.0.0/12**
**查询可执行命令如下:**
kubectl get pod -n kube-system $(kubectl get pod -n kube-system |grep kube-apiserver |awk '{print $1}') -o yaml | grep service-cluster-ip-range
ports:
#Service自身端口,集群其他应用访问这个Service就用这个端口
#访问地址:svc-nginx:80
- port: 80
protocol: TCP
targetPort: 80 #后端Pod容器监听的端口
selector:
#标签选择器,会筛选当前命名空间下,app:nginx标签的所有Pod
app: nginx
type: ClusterIP