K8s服务发现和负载均衡
环境安装参考前面几篇主机节点cpu内存硬盘192.168.233.140master124g30g192.168.233.141node124g30g192.168.233.142node224g30g192.168.233.143harbor仓库24g30g准备工作143上面使用docker下载nginx的镜像,然后上传到harbor仓库。镜像的话可以在https://hub.docker.co
环境
安装参考前面几篇
主机 | 节点 | cpu | 内存 | 硬盘 |
---|---|---|---|---|
192.168.233.140 | master1 | 2 | 4g | 30g |
192.168.233.141 | node1 | 2 | 4g | 30g |
192.168.233.142 | node2 | 2 | 4g | 30g |
192.168.233.143 | harbor仓库 | 2 | 4g | 30g |
准备工作
143上面使用docker下载nginx的镜像,然后上传到harbor仓库。
镜像的话可以在https://hub.docker.com/上面找自己想要的镜像。
docker pull nginx:1.16.1
需要上传到该目录下,需要修改镜像的名称。
注意:harbor上面创建的项目需要为公开的。如public就是公开的,就是右边的访问级别,否则后期k8s在拉取镜像的时候会报错。可以点击左边的三个点进行设置
[root@hub ~]# docker images|grep nginx
nginx 1.16.1 dfcfd8e9a5d3 10 months ago 127MB
hub.bushro.com/public/nginx 1.16.1 dfcfd8e9a5d3 10 months ago 127MB
vmware/nginx-photon 1.11.13 2971c92cc1ae 3 years ago 200MB
更改名称
docker tag dfcfd8e9a5d3 hub.bushro.com/public/nginx:1.16.1
上传到harbor仓库
[root@hub harbor]# docker push hub.bushro.com/public/nginx:1.16.1
The push refers to repository [hub.bushro.com/public/nginx]
c23548ea0b99: Pushed
82068c842707: Pushed
c2adabaecedb: Pushed
1.16.1: digest: sha256:2963fc49cc50883ba9af25f977a9997ff9af06b45c12d968b7985dc1e9254e4b size: 948
案例
案例:k8s上面创建多个pod,通过一个service来进行负载均衡。并把服务暴露出来。
创建deployment
创建nginx-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: hub.bushro.com/public/nginx:1.16.1
ports:
- containerPort: 80
这里的image是harbor仓库中的,docker会去harbor中拉取镜像下来。
前提:k8s集群中的每个节点的docker要去私有仓库(harbor)拉取镜像,需要先进行配置。
docker login https://hub.bushro.com
启动
–record参数可以记录命令,我们可以很方便的查每次revision的变化
deployment会自动为我们创建3个pod,因为我们在yaml中定义了。
[root@k8s-master1 ~]# kubectl apply -f nginx-deployment.yaml --record
deployment.extensions/nginx-deployment created
[root@k8s-master1 ~]# kubectl get pod -o wide -w|grep nginx
nginx-deployment-657494b55f-hxxgn 1/1 Running 0 15s 10.244.2.75 k8s-node2 <none> <none>
nginx-deployment-657494b55f-kq8rf 1/1 Running 0 15s 10.244.1.60 k8s-node1 <none> <none>
nginx-deployment-657494b55f-lqrbx 1/1 Running 0 15s 10.244.2.74 k8s-node2 <none> <none>
service
Kubernetes Service 定义了这样一种抽象:一个Pod的逻辑分组,一种可以访问它们的策略——通常称为微服务。这一组Pod能够被Service访问到,通常是通过Label Selector
创建nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 8080
targetPort: 80
- targetPort :pod端口
- port:service用来负载均衡的端口
- spec.selecttor.app需要和上面deployment中的labels.app一致,这样service才能知道要对谁进行负载。
启动service
service默认的类型:Clusterlp:自助分配一个仅Cluster内部可以访问的虚拟IP
[root@k8s-master1 ~]# kubectl apply -f nginx-service.yaml --record
service/nginx-svc created
[root@k8s-master1 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 246d
myapp NodePort 10.101.153.61 <none> 80:32051/TCP 217d
nginx-svc ClusterIP 10.109.195.11 <none> 8080/TCP 14s
endpoint
endpoint是k8s集群中的一个资源对象,存储在etcd中,用来记录一个service对应的所有pod的访问地址。service配置selector,endpoint controller才会自动创建对应的endpoint对象;否则,不会生成endpoint对象.
例如,k8s集群中创建一个名为hello的service,就会生成一个同名的endpoint对象,ENDPOINTS就是service关联的pod的ip地址和端口。
服务发现
- Pod内服务调用:localhost:容器内应用端口
- Pod间服务调用:服务名.namespace名:服务端口
- 外部服务调用∶负载均衡器IP:负载均衡器内映射端口或Ingress URL
在外面想通过服务名.namespace名:服务端口的形式进行访问,是没办法进行的。因为namespace名默认为default,没有dns解析是识别不到的。pod内部有可以解析。可以启动一个pod然后进里面验证下服务发现。
bosybox是一个工具,非常小。直接启动它来验证。
kubectl run busybox --rm -it --image=busybox /bin/sh
这告诉我们在kubectl的任何pod里面都可以通过服务名.namespace名:服务端口的方式进行访问。这就是pod之间的服务发现,内部之间进行通信就通过这种方式。
默认的clusterIp的方式是无法对外提供服务的。我们进行修改下让它能够对外提供服务。
修改nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
type: NodePort
selector:
app: nginx
ports:
- protocol: TCP
port: 8080
targetPort: 80
nodePort: 30000
nodePort的取值范围在:30000-32767
重新启动
在外面进行访问,三台都可以访问到。
更多推荐
所有评论(0)