第7章 k8s基础篇-服务发布入门_dluhehe的博客-爱代码爱编程
杜宽老师宽k8s课程学习笔记
7.1 k8s是如何发布服务的
南北流量:放在公网上供用户访问;
东西流量:系统间内部访问;
pod删除后重建,ip地址发生变化,故不能采用ip方式访问pod。
k8s对内用service(对应东西流量),对外用ingress(nginx实现,通过域名代理到service,通过service再访问pod)(对应南北流量)。
7.2 什么是Label 和 Selector
不同资源控制器打的标签不要一样,比如deployment和deamomset的标签一样都是app=nginx,那就会出现问题。
---查看节点的标签
kubectl get nodes --show-labels
7.3 Label 和 Selector的使用
kubectl label node k8s-node01 k8s-node02 subnet=7
新建测试labels的yaml文件:nginx-deploy_labels_1123.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
spec:
replicas: 5 #副本数
selector:
matchLabels:
app: nginx
#strategy:
#rollingUpdate:
#maxSurge: 25%
#maxUnavailable: 25%
#type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
nodeSelector:
subnet: "7"
containers:
- image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12
imagePullPolicy: IfNotPresent
name: nginx
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
kubectl create -f nginx-deploy_labels_1123.yaml;
kubectl get po -owide;
label命令可以给node,pod,service等多种类型资源打上标签;
5个副本都分配在被打标签的(subnet=7)node01和noge02上面;
打标签练习
#Selector 选择器过滤
kubectl get nodes -l 'role in (master,node)'
修改标签
kubectl label nodes k8s-node01 subnet=120 --overwrite
统一修改标签
kubectl label nodes -l subnet subnet=120 --overwrite
删除标签
kubectl label nodes k8s-node01 subnet-
标签批量删除
kubectl label nodes -l subnet subnet-
7.4 什么是service
可以通过ip访问
7.5 service的基本使用
去掉nodeselector后的yaml文件如下:
[root@k8s-master01 ~]# cat nginx-deploy_labels_1123.yaml
# cat nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
spec:
replicas: 5 #副本数
selector:
matchLabels:
app: nginx
#strategy:
#rollingUpdate:
#maxSurge: 25%
#maxUnavailable: 25%
#type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
#nodeSelector:
# subnet: "7"
containers:
- image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12
imagePullPolicy: IfNotPresent
name: nginx
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
kubectl replace -f nginx-deploy_labels_1123.yaml
service必须是pod在同一个namespace下,不然service会找不到pod;
kubectl create -f service_1126.yaml
测试结果
测试:删除app=nginx标签的pod后,新建的pod ip地址发生变化,但仍然可以通过service地址访问。
service采用轮循方式,将请求随机转发后其代理的5个pod中处理;
具体修改位置
修改后的yaml文件如下
[root@k8s-master01 ~]# cat nginx-deploy_labels_1123.yaml
# cat nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
spec:
replicas: 5 #副本数
selector:
matchLabels:
app: nginx
#strategy:
#rollingUpdate:
#maxSurge: 25%
#maxUnavailable: 25%
#type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
#nodeSelector:
# subnet: "7"
containers:
- image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12-alpine
imagePullPolicy: IfNotPresent
name: nginx
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
kubectl replace -f nginx-deploy_labels_1123.yaml
7.6 service的类型
Kubernetes Service Type(服务类型)主要包括以下几种:
➢ ClusterIP :在集群内部使用,默认值,只能从集群中访问。
➢ NodePort :在所有安装了 Kube P roxy 的节点上打开一个端口,此端口可以代理至后端
Pod ,可以通过 NodePort 从集群外部访问集群内的服务,格式为 NodeIP:NodePort 。eg:比如笔记本电脑想访问pod服务,显然不能直接在笔记本的浏览器输入pod的地址访问,但我们笔记本和宿主机(master01-03+node01-02,ip:192.168.1.107-192.168.1.111)是通的,可以通过宿主机加映射到pod,这样笔记本就可以直接访问pod里的服务了。
➢ LoadBalancer :使用云提供商的负载均衡器公开服务,成本较高。
➢ ExternalName :通过返回定义的 CNAME 别名,没有设置任何类型的代理,需要 1.7 或
更高版本 kube dns 支持。