004--Ubuntu使用K8S(kube-proxy)
1、参考网址:
git网址:https://github.com/liuyi01/kubernetes-starter/blob/master/docs/2-kubernetes-simple.md
2、说明
1、kube-proxy和kube-dns非常重要,基本上所有的集群都会使用
但是从技术角度讲,这两个是可选取组件
2、使用pod和deployment基本上可以完成集群的搭建使用,但是外部不可以访问
- 使用service,就安装kube-proxy
- 使用名称解析service,就安装kube-dns
3、kube-proxy安装在Node节点上
4、安装完kube-proxy后,我们就可以将deployment里面负载的pod,暴露端口给外部进行访问
kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
5、此时查看services(此时kubernetes-bootcamp会添加在services上)
kubectl get services(只能在master上查询)
6、验证监听地址(只能在Node节点上验证,master并不监听这个端口)
netstat -ntlp | grep 39699
7、port对比说明
1、kubectl run --port=80(或者kubectl expose --port=80)
service在每一个Node上分配的port,即NodePort(clusterIP+nodePort可定位到具体Node上的pod)
2、kubectl expose --target-port 8080
在每一个pod上(pod内部的虚拟网络端口)
3、kubectl get services查看的时候还有一个port:nodePort 25433(可能是其他值,每一个service对应一个NodePort)
kube-proxy在Node上真实启动的端口去监听服务,可以通过这个端口访问服务(真实IP+随机port)
4、总结:
- 随机端口是用户最直接的访问端口,每一Node上都有一个,即NodePort(作用最大,浏览器可以访问的外部暴露端口,NodeIP:NodePort)
- port是多个Node节点给service提供统一访问端口,(作用中等,用户无感知,在集群中使用,clusterIP:port)
- targetPort是pod内部真实启动服务的端口(作用最小,可以随便定义,也可以让系统自己生成)
- service查询结果的意义:将集群中service请求分发到每一个Node上:clusterIP:port--> NodeIP:NodePort
- 所以在Node节点上查询,Node会对NodePort(随机IP)进行监听,因为要把clusterIP:port--> NodeIP:NodePort
- 作用类似于nginx,将service将request分发到指定的服务器上(clusterIP:port对应多个NodeIP:NodePort)
- 可以验证,curl clusterIP:port或者NodeIP:NodePort
curl 10.68.4.132:80 在Node节点上进行访问(master其实不是cluster,因为master只是nginx的作用,将request转发到Node上)
curl 192.168.221.138:25433 在所有节点上进行访问(真实的网络请求,也可以用浏览器访问,不会进行负载,直接访问)
- 通过curl可以知道:
1、浏览器只能访问192.168.221.138:25433、192.168.221.140:25433,不能访问master的ip:25433
2、pod创建之后,其实已经跑起来了,但只能通过kubectl proxy进行测试访问
3、service的创建,等于给pod提供了真实的调用接口
4、因为我们会在集群中调用,所以只暴露一个端口,但这个接口不能让外部访问,是clusterIP:port
5、service的创建,等于将pod开放给用户了,所以用户可以指定Node进行访问,是NodeIP:NodePort
6、类似于Nginx的功能其实就是kube-proxy的作用,因为master上没有,所以不能进行负载
7、那么问题来了,如何访问clusterIP:NodePort
- 1、在Node节点上查询docker运行的容器
docker ps | grep bootcamp
- 2、选择一个container进入
docker exec -it 71644a5389d9 /bin/bash
docker exec -it 71644a5389d9 /bash (上面的简写)
- 3、执行curl clusterIP:NodePort
curl 10.68.4.132:80
- 4、也可以执行pod的ip:port(kubectl get pods -o wide)
curl 172.20.33.134:80
8、运行deployment命令
kubectl delete deployments/kubernetes-bootcamp
kubectl run kubernetes-bootcamp --image=docker.io/jocatalin/kubernetes-bootcamp:v1 --port 80
kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 80 --target-port 8080
9、删除deployment
1、如果只删除deployment,service不会删除,pods会删除
kubectl delete deployments/kubernetes-bootcamp
2、如果删除service,不会影响deployment和pod(service是附加功能)
kubectl delete service -l run=kubernetes-bootcamp
10、查询pod运行在哪个Node上
#查询pod运行在哪个Node上
kubectl get pods -o wide
#查询pod使用的哪个端口,哪个IP(当前的IP是pod的虚拟IP:虚拟port)
kubectl describe pods nginx-pod
#然后curl调用测试
curl ip:port
11、附加的查询命令
#查看某个pod重启次数
kubectl get pod nginx-pod --template="{{range .status.containerStatuses}}{{.name}}:{{.restartCount}}{{end}}"
#查看某个pod生命周期
kubectl get pod mysql --template="{{.status.phase}}"
12、创建service.yaml
- #创建service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
ports:
- port: 8080
targetPort: 80
nodePort: 20000
selector:
app: nginx
type: NodePort
- #运行service服务
kubectl craete -f pod_service.yaml
- #查看服务运行
kubectl get services
- #说明一点
1、service本身是虚拟的东西,只是对pod进行分组而已
2、并不会创建pod,但是暴露的时候会有clusterIP和nodePort
3、curl clusterIP:nodePort(curl 192.168.221.138:20000)其实和我们刚才创建访问的是同样的pod
3、细节注意:
1、运行deployment的时候要加上--port 80,要不然在node内部没有办法进行访问,describe时没有端口,使用不了curl命令
2、对spec的理解:这是说明书,是面向未来的一种设计,所以要和相关组件同步使用,要不然会出问题(比如port的定义,要和deployment保持一致)
3、