Service 资源
当前的集群,启动了两个 myweb 服务(nginx),当前可以在集群内用容器 IP 进行访问(内网),但无法通过外网访问。(具体来说是此私有地址没有绑定在节点的 IP 上,外网同时也获取不到此节点内容器的 IP 服务)
image.png在 docker 中,要想被外界访问,我们通常做端口映射,将容器 IP 的端口映射到节点的 端口上,在 K8S 中不可以直接做端口映射,因为在集群内部容器的启动是不固定在某个节点的,而且不是固定一个的。因此,K8S 中引入了一个资源叫 Service。
创建 Service 资源
Service 启用了一个 Cluster IP,向内屏蔽了 Pod IP,向外整合了 Node IP。因此,当访问任意 Node IP 的端口时,会定位到 ClusterIP,然后负载均衡到内部的 Pod IP
image.png# cat k8s/svc/nginx-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: myweb
spec:
type: NodePort. # 端口映射的方式,还有其他支持
ports:
- port: 80 # cluster IP 的端口
nodePort: 30000 # 宿主机的端口(宿主机的端口在配置文件中指定)
targetPort: 80 # pod IP 地址
selector: # 为哪些 Pod 做负载均衡是通过标签选择器选择的
app: myweb2
kubectl create -f k8s/svc/nginx-svc.yaml # 创建 Service 资源
kubectl describe svc myweb # 查看 Service 资源
kubectl describe svc
这里与教程不一样:Endpoints 中没有匹配到任何 Pod 资源。发现 rc 资源一直没创建起来。
kubectl delete pod --all # 会删除所有 pod kubectl get all # 获取所有 pod 列表 # 删除所有 pod 后发现 rc 的 pod 资源没创建出来
通过重启 controller-manager
重启 controller-manager 后显示了 endpointssystemctl restart kube-controller-manager
才显示正常。
重启 master 节点重新查看一下 controller-manager 服务,原来它一直没有开机自启动,难怪每次重启后总是会出现问题。最后通过kubectl enable kube-controller-manager
命令设置开机自启动。
重启节点后查看 controller-manager 状态
启动正常后,通过我的主机(系列文章中说的 master/node 各节点都是我本机装的 vmware 虚拟机)访问浏览器,终于可以正常访问了(用另外两个 node 的 IP 也可以正常显示):
image.png
所有 node 节点的 IP 都可以访问到 nginx 服务是由各节点上的 kube-proxy 服务自动帮我们创建的。
服务自动发现
演示:通过命令实现扩容 rc 资源。
效果:扩容的 Pod 会自动加入到集群中,这就是服务自动发现。
kubectl scale rc myweb2 --replicas=3
image.png
负载均衡
所启动的服务自动实现了负载均衡。
可通过在不同 nginx 容器中写入不同的 index.html(/usr/share/nginx/html/
),然后访问浏览器地址,可发现此功能(由于浏览器会保持长连接,所以看起来不像是 RR 策略)。
修改节点端口号范围
按如下方式操作:
# 修改配置文件
vim /etc/kubernetes/apiserver
# (参考)配置文件中指定 cluster IP 的范围的配置
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
# 修改内容行,设置端口范围
KUBE_API_ARGS="--service-node-port-range=10000-60000"
# 启动命令文件是在这里,以上修改的变量在应用后会生效在此文件中
cat /usr/lib/systemd/system/kube-apiserver.service
# 重启
systemctl restart kube-api-server
WeChat0ac7271a015a7b148acf681241727083.png
image.png