Kubernetes实战篇之服务发现

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访问服务

  1. node节点开放 80端口

  2. Windows新增hosts配置

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

相关推荐
Zaly.2 小时前
解决 Windows 下 Docker Desktop 启动失败:从虚拟化报错到成功运行的全流程
windows·docker·容器
梅孔立2 小时前
Docker 全场景安装与镜像管理实战教程(在线+内网离线+镜像导入导出)
运维·docker·容器
only_Klein2 小时前
Kubernetes 版本升级
容器·kubernetes·upgrade
Elastic 中国社区官方博客3 小时前
使用 Jina Embeddings v5 和 Elasticsearch 构建“与你的网站数据聊天”的 agent
大数据·人工智能·elasticsearch·搜索引擎·容器·全文检索·jina
Bruce_Liuxiaowei3 小时前
OpenClaw Docker容器升级实战:从v2026.2.22-2到v2026.2.24的安全配置变更与故障排除
安全·docker·ai·容器·openclaw
sanyii3131313 小时前
k8s核心资源Pod-主容器之存活性探测
云原生·容器·kubernetes
兴趣使然黄小黄3 小时前
【Docker】Docker架构详解:核心组件及其应用指南
docker·容器·架构
shughui15 小时前
Docker Desktop下载、安装、配置、使用
运维·docker·容器·自动化
EverydayJoy^v^19 小时前
Kubernetes 知识点(1)——基础依赖
云原生·容器·kubernetes