k8s之服务发布

一、Service

1.1  通过yaml定义

apiVersion: v1
kind: Service  #资源类型
metadata:
  name: nginx-svc #svc名字
  labels:
    app: nginx  #svc自己的标签
spec:  #期望
  selector: #匹配哪些pod(所有标签被匹配的)会被代理
    app: nginx-deploy
  ports:
  - port: 80 #service 自己的端口,在使用内网ip访问时也使用
    targetPort: 80  #目标 pod的端口
    name: web  #为端口起个名字 
  type: NodePort  #随机启动一个端口(30000-326)  映射pod的端口 且集群中的每一个pod都会映射这个端口

1.2 通过yaml创建endpoint

k8s会根据service关联到pod的podIP信息组合成一个endpoint。

#ep的name对应着svc的name

apiVersion: v1
kind: Service  #资源类型
metadata:
  name: nginx-svc-external #svc名字
  labels:
    app: nginx  #svc自己的标签
spec:  #
  ports:
  - port: 80 #service 自己的端口,在使用内网ip访问时也使用
    targetPort: 80  #目标 pod的端口
    name: web  #为端口起个名字 
  type: ClusterIP  #随机启动一个端口(30000-326)  映射pod的端口 且集群中的每一个pod都会映射这个端口

1.3 命令操作

# 创建 service
kubectl create -f nginx-svc.yaml

# 查看 service 信息,通过 service 的 cluster ip 进行访问
kubectl get svc 

# 查看 pod 信息,通过 pod 的 ip 进行访问
kubectl get po -owide

# 创建其他 pod 通过 service name 进行访问(推荐)
kubectl exec -it busybox -- sh
curl http://nginx-svc

# 默认在当前 namespace 中访问,如果需要跨 namespace 访问 pod,则在 service name 后面加上 .<namespace> 即可
curl http://nginx-svc.default

1.4 代理 k8s 外部服务

各环境访问名称统一、访问 k8s 集群外的其他服务、项目迁移

实现方式:
编写 service 配置文件时,不指定 selector 属性
自己创建 endpoint
endpoint 配置:
apiVersion: v1
kind: Endpoints
metadata:
  labels:
    app: wolfcode-svc-external # 与 service 一致
  name: wolfcode-svc-external # 与 service 一致
  namespace: default # 与 service 一致
subsets:
- addresses:
  - ip: <target ip> # 目标 ip 地址
  ports: # 与 service 一致
  - name: http
    port: 80
    protocol: TCP

1.5 反向代理外部域名

apiVersion: v1
kind: Service
metadata:
  labels:
    app: wolfcode-external-domain
  name: wolfcode-external-domain
spec:
  type: ExternalName
  externalName: www.wolfcode.cn

1.6  常用类型

ClusterIP:
默认类型,仅集群内部可访问。为Service在集群内分配一个虚拟IP。

ExternalName:
Service记录为外部域名,如 database.example.com。
集群外请求该域名会被转发到 external DNS。
不支持负载均衡,只能访问一个地址。 返回定义的 CNAME 别名,可以配置为域名

NodePort:
在集群内部使用ClusterIP,同时在每台Node上映射一个端口。
外部可通过<NodeIP>:<NodePort>访问Service。
会在所有安装了 kube-proxy 的节点都绑定一个端口,此端口可以代理至对应的 Pod,集群外部可以使用任意节点 ip + NodePort 的端口号访问到集群中对应 Pod 中的服务。
当类型设置为 NodePort 后,可以在 ports 配置中增加 nodePort 配置指定端口,需要在下方的端口范围内,如果不指定会随机指定端口
端口范围:30000~32767
端口范围配置在 /usr/lib/systemd/system/kube-apiserver.service 文件中

LoadBalancer:
叠加了NodePort功能,同时使用外接负载均衡器提供外网访问。
集群必须支持外接负载均衡器(如云平台提供)。
负载均衡器会配置公网入口,转发流量到NodeNodePort。使用云服务商(阿里云、腾讯云等)提供的负载均衡器服务

ClusterIP仅集群内部使用。
ExternalName用于外域名映射访问。
NodePort允许直接访问集群内Service。
LoadBalancer提供了负载均衡的公网入口。

二、Ingress

Ingress 可以理解为也是一种 LB 的抽象,它的实现也是支持 nginx、haproxy 等负载均衡服务的

2.1 安装 ingress-nginx

# 添加仓库
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx

# 查看仓库列表
helm repo list

# 搜索 ingress-nginx
helm search repo ingress-nginx

# 下载安装包
helm pull ingress-nginx/ingress-nginx

# 将下载好的安装包解压
tar xf ingress-nginx-xxx.tgz

# 解压后,进入解压完成的目录
cd ingress-nginx

# 修改 values.yaml
镜像地址:修改为国内镜像
registry: registry.cn-hangzhou.aliyuncs.com
image: google_containers/nginx-ingress-controller
image: google_containers/kube-webhook-certgen
tag: v1.3.0

hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet

修改部署配置的 kind: DaemonSet
nodeSelector:
  ingress: "true" # 增加选择器,如果 node 上有 ingress=true 就部署
将 admissionWebhooks.enabled 修改为 false
将 service 中的 type 由 LoadBalancer 修改为 ClusterIP,如果服务器是云平台才用 LoadBalancer


# 为 ingress 专门创建一个 namespace
kubectl create ns ingress-nginx


# 为需要部署 ingress 的节点上加标签
kubectl label node k8s-node1 ingress=true

# 安装 ingress-nginx
helm install ingress-nginx ./ingress-nginx -n ingress-nginx或
helm install ingress-nginx  -n ingress-nginx .

2.2 基本使用

2.2.1 创建一个 ingress

apiVersion: networking.k8s.io/v1
kind: Ingress # 资源类型为 Ingress
metadata:
  name: wolfcode-nginx-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules: # ingress 规则配置,可以配置多个
  - host: k8s.wolfcode.cn # 域名配置,可以使用通配符 *
    http:
      paths: # 相当于 nginx 的 location 配置,可以配置多个
      - pathType: Prefix # 路径类型,按照路径类型进行匹配 ImplementationSpecific 需要指定 IngressClass,具体匹配规则以 IngressClass 中的规则为准。Exact:精确匹配,URL需要与path完全匹配上,且区分大小写的。Prefix:以 / 作为分隔符来进行前缀匹配
        backend:
          service: 
            name: nginx-svc # 代理到哪个 service
            port: 
              number: 80 # service 的端口
        path: /api # 等价于 nginx 中的 location 的路径前缀匹配

2.2.2 多域名配置

apiVersion: networking.k8s.io/v1
kind: Ingress # 资源类型为 Ingress
metadata:
  name: wolfcode-nginx-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules: # ingress 规则配置,可以配置多个
  - host: k8s.wolfcode.cn # 域名配置,可以使用通配符 *
    http:
      paths: # 相当于 nginx 的 location 配置,可以配置多个
      - pathType: Prefix # 路径类型,按照路径类型进行匹配 ImplementationSpecific 需要指定 IngressClass,具体匹配规则以 IngressClass 中的规则为准。Exact:精确匹配,URL需要与path完全匹配上,且区分大小写的。Prefix:以 / 作为分隔符来进行前缀匹配
        backend:
          service: 
            name: nginx-svc # 代理到哪个 service
            port: 
              number: 80 # service 的端口
        path: /api # 等价于 nginx 中的 location 的路径前缀匹配
      - pathType: Exec # 路径类型,按照路径类型进行匹配 ImplementationSpecific 需要指定 IngressClass,具体匹配规则以 IngressClass 中的规则为准。Exact:精确匹配>,URL需要与path完全匹配上,且区分大小写的。Prefix:以 / 作为分隔符来进行前缀匹配
        backend:
          service:
            name: nginx-svc # 代理到哪个 service
            port:
              number: 80 # service 的端口
        path: /
  - host: api.wolfcode.cn # 域名配置,可以使用通配符 *
    http:
      paths: # 相当于 nginx 的 location 配置,可以配置多个
      - pathType: Prefix # 路径类型,按照路径类型进行匹配 ImplementationSpecific 需要指定 IngressClass,具体匹配规则以 IngressClass 中的规则为准。Exact:精确匹配>,URL需要与path完全匹配上,且区分大小写的。Prefix:以 / 作为分隔符来进行前缀匹配
        backend:
          service:
            name: nginx-svc # 代理到哪个 service
            port:
              number: 80 # service 的端口
        path: /

在 Kubernetes 中,通过 `Deployment` 资源对象来进行服务发布和管理。下面是一个简单的发布服务的步骤: 1. 创建一个 Deployment 文件,例如 `myapp-deployment.yaml`: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: myapp labels: app: myapp spec: replicas: 3 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: myapp image: myapp:latest ports: - containerPort: 8080 ``` 上述文件定义了一个名为 `myapp` 的 Deployment,使用名为 `myapp` 的镜像,副本数为 3 个,监听 8080 端口。 2. 使用 `kubectl` 命令创建 Deployment: ``` $ kubectl apply -f myapp-deployment.yaml ``` 3. 等待 Deployment 创建完成: ``` $ kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE myapp 3/3 3 3 1m ``` 4. 创建一个 Service 文件,例如 `myapp-service.yaml`: ```yaml apiVersion: v1 kind: Service metadata: name: myapp spec: selector: app: myapp type: ClusterIP ports: - name: http port: 80 targetPort: 8080 ``` 上述文件定义了一个名为 `myapp` 的 Service,将请求转发到 `myapp` Deployment 中的容器的 8080 端口。在 Kubernetes 中,Service 负责暴露 Deployment,使得其他容器或外部网络可以访问。 5. 使用 `kubectl` 命令创建 Service: ``` $ kubectl apply -f myapp-service.yaml ``` 6. 等待 Service 创建完成: ``` $ kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE myapp ClusterIP 10.102.49.231 <none> 80/TCP 1m ``` 7. 访问服务: 可以使用 `kubectl port-forward` 命令将 Service 映射到本地端口,例如: ``` $ kubectl port-forward service/myapp 8080:80 ``` 然后通过 `http://localhost:8080` 访问服务。 以上是一个简单的发布服务的步骤。在实际使用中,需要根据实际情况来定义 Deployment 和 Service 的配置,例如添加健康检查、负载均衡策略等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值