Service:内部访问
整体架构

资源清单
yaml
apiVersion: v1
kind:Service # 资源类型为 Service
metadata:
name:nginx-svc # Service 名字
labels:
app:nginx # Service 自己本身的标签
spec:
selector: #匹配哪些 pod会被该 service代理
app:nginx-deploy #所有匹配到这些标签的 pod 都可以通过该 service 进行访问
ports:# 端口映射
- port:80#service 自己的端口,在使用内网 ip访问时使用
targetPort:80#目标 pod的端口
name:web #为端口起个名字
type:NodePort #随机启动一个端口(30000-32767),映射到 ports中的端口,该端口是直接绑定在 node上的,且集群中的每node都会绑定这个端口(也可以用于将服务暴露给外部访间,但是这种方式实际生产环境不推荐,效率较低,而且 Service 是四层负载)
Service常用类型
ClusterIP
只能 在集群内部使用,不配置类型的话默认就是ClusterIP
ExternalName
返回定义的 CNAME 别名,可以配置为域名
NodePort
- 会在 所有安装了 kube-proxy 的节点都绑定一个端口 ,此端口可以代理至对应的Pod,集群外部可以使用任意节点ip+NodePort的端口号访问到集群中对应Pod中的服务。
- 当类型设置为NodePort后,可以在 ports配置中增加nodePort配置指定端口,需要在下方的端口范围内,如果不指定会随机指定端口
- 端口范围:30000~32767
- 端口范围配置在
/usr/lib/systemd/system/kube-apiserver.service文件中
LoadBalancer
使用云服务商(阿里云、腾讯云等)提供的负载均衡服务
Ingress:外部访问
整体架构

Ingress-nginx安装
Ingress-nginx安装官网参考,基于Helm包管理器进行安装(Helm简单理解为类似Java的Maven)
安装helm
bash
$ wget https://get.helm.sh/helm-v4.1.1-linux-amd64.tar.gz
$ tar -zxvf helm-v4.1.1-linux-amd64.tar.gz
$ cd linux-amd64/
$ cp helm /usr/local/bin
# 验证
$ helm version
#################### OUTPUT ###########################
version.BuildInfo{Version:"v4.1.1", GitCommit:"5caf0044d4ef3d62a955440272999e139aafbbed", GitTreeState:"clean", GoVersion:"go1.25.7", KubeClientVersion:"v1.35"}
添加Helm仓库
bash
# 添加仓库
$ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
#################### OUTPUT ###########################
"ingress-nginx" has been added to your repositories
# 查看仓库列表
$ helm repo list
#################### OUTPUT ###########################
NAME URL
ingress-nginx https://kubernetes.github.io/ingress-nginx
# 搜索ingress-nginx
$ helm search repo ingress-nginx
#################### OUTPUT ###########################
NAME CHART VERSION APP VERSION DESCRIPTION
ingress-nginx/ingress-nginx 4.14.3 1.14.3 Ingress controller for Kubernetes using NGINX a...
下载包(ingress-nginx)
bash
helm pull ingress-nginx/ingress-nginx
修改配置
bash
# 修改values.yaml
# 镜像地址:修改为国内镜像
# 第一处
global:
image:
# -- Registry host to pull images from.
registry: registry.cn-hangzhou.aliyuncs.com
# 第二处
controller:
...
image:
...
image: google_containers/nginx-ingress-controller
...
# digest: sha256:82917be97c0939f6ada1717bb39aa7e66c229d6cfb10dcfc8f1bd42f9efe0f81
# digestChroot: sha256:ffdab64d0e0556f810d82d618a0fa97c4fc8dc2bc5717c51bfe83b5d4252c73e
# 第三处:修改 kube-webhook-certgen 镜像名称
patch:
...
image:
image: google_containers/kube-webhook-certgen
# digest: sha256:7c74a715af2c94cb734785b4d3ea1357b4f02b88e1e123c622a9cb68b62f669c
# 修改部署配置
kind: DaemonSet
nodeSelector:
ingress: "true" # 新增配置:选择器
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
# 将service 中的type 由LoadBalancer修改为 ClusterIP,如果服务器是云平台采用LoadBalancer
type: ClusterIP
# 将 admissionWebhooks.enabled 修改为 false
admissionWebhooks:
enabled: false
创建Namespace
bash
# 为 ingress 专门创建一个 namespace
$ kubectl create ns ingress-nginx
安装Ingress
bash
# 为需要部署 ingress 的节点上加标签
$ kubectl label node k8s-node1 ingress=true
# 安装 ingress-nginx
$ helm install ingress-nginx -n ingress-nginx .
# 验证安装结果
# 查看po
$ kubectl get po -n ingress-nginx
NAME READY STATUS RESTARTS AGE
ingress-nginx-controller-xfv4q 1/1 Running 0 53m
# 查看svc
$ kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller ClusterIP 10.110.89.216 <none> 80/TCP,443/TCP 53m
# 查看ingress
$ kubectl get ds -n ingress-nginx
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
ingress-nginx-controller 1 1 1 1 1 ingress=true,kubernetes.io/os=linux 53m
基本使用
资源清单
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress # 资源类型为ingress
metadata:
name: nginx-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: / # 对访问路径进行重写,这里是将 /so 重写为 /,使其能够正确访问到nginx
spec:
ingressClassName: nginx
rules: # ingress 规则配置,可以配置多个
- host: k8s.king.cn # 域名配置,可以使用通配符 *
http:
paths: # 相当于nginx 的location配置,可以配置多个
- pathType: Prefix # 路径类型,按照路径类型进行匹配 ImplementationSpecific 需要指定 IngressCluster,具体匹配规则以 IngressClass 中的规则为准,Exact:精确匹配,URL需要与path完全匹配上,且区分大小写。Prefix: 以 / 作为分隔符来进行前缀匹配
backend:
service:
name: nginx # 代理到哪个service
port:
number: 80 # service的端口
path: /so # 等价于nginx中的location的路径前缀匹配
bash
$ kubectl create -f ingress-nginx.yaml
$ kubectl get ingress -o wide
NAME CLASS HOSTS ADDRESS PORTS AGE
nginx-ingress nginx k8s.king.cn 10.110.89.216 80 57m
通过ingress访问服务
-
node节点开放 80端口
-
Windows新增hosts配置

-
通过域名访问nginx服务
k8s.king.cn/so
