k8s部署Deployment、创建Service,创建Ingress规则,分三步单独部署。

有已经存在的业务镜像上传在阿里云的容器镜像服务,镜像地址:registry.cn-hangzhou.aliyuncs.com/yihan/dotnet6-demo:0.0.1

说明:
镜像拉取使用阿里云私有镜像密钥 aliyun-secret
Deployment:dotnet-demo-v1
Service:dotnet-demo-v1-svc
Ingress: dotnet-demo-v1-ingress,新增 /v1 路由规则,
支持 IP 直接访问 + 域名访问,路径 /v1 转发到新服务

 

 创建阿里云容器镜像的访问权限:

方案一:纯命令创建secret

kubectl create secret docker-registry aliyun-secret \
--docker-server=registry.cn-hangzhou.aliyuncs.com \
--docker-username=你的阿里云登录账号 \
--docker-password=阿里云容器镜像仓库密码 \
--docker-email=任意邮箱

 

方案二:直接创建 reg-aliyun-secret.yaml 文件

apiVersion: v1
kind: Secret
metadata:
  name: aliyun-secret
  namespace: default
type: kubernetes.io/dockerconfigjson
stringData:
  .dockerconfigjson: |
    {
      "auths": {
        "registry.cn-hangzhou.aliyuncs.com": {
          "username": "阿里云登录帐号",
          "password": "阿里云登录密码",
          "email": "任意邮箱"
        }
      }
    }

 

或者 .dockerconfigjson的值填json转成base64后的字符串:

apiVersion: v1
kind: Secret
metadata:
  name: aliyun-secret
  namespace: default
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: ewogICAgICAiYXV0aHMiOiB7CiAgICAgICAgInJlZ2lzdHJ5LmNuLWhhbmd6aG91LmFsaXl1bmNzLmNvbSI6IHsKICAgICAgICAgICJ1c2VybmFtZSI6ICLpmL/ph4zkupHnmbvlvZXluJDlj7ciLAogICAgICAgICAgInBhc3N3b3JkIjogIumYv+mHjOS6keeZu+W9leWvhueggSIsCiAgICAgICAgICAiZW1haWwiOiAi5Lu75oSP6YKu566xIgogICAgICAgIH0KICAgICAgfQogICAgfQ==

 

执行创建

kubectl apply -f reg-aliyun-secret.yaml

 

查看secret

kubectl get secret

测试secret是否有效:

kubectl run test-demo-pod \
--image=registry.cn-hangzhou.aliyuncs.com/yihan/dotnet6-demo:0.0.1 \
--restart=Never \
--overrides='{"spec":{"imagePullSecrets":[{"name":"aliyun-secret"}]}}'

输出 pod/test-demo-pod created 表示创建pod成功,代表 设置的secret正确。

 

查看pod状态:

kubectl get pod test-demo-pod

 

image

 

然后删除测试用的pod:

kubectl delete pod test-demo-pod

 

【修改默认 ServiceAccount(全局生效,推荐长期使用)】

给当前命名空间默认账号绑定 aliyun-secret,后续所有 pod/deployment 自动带拉取密钥,不用每次配置:

kubectl patch serviceaccount default -p '{"imagePullSecrets":[{"name":"aliyun-secret"}]}'

 

【部署Deployment】

有两种方式部署deploy:

第一种:用纯命令部署deploy:

kubectl create deployment dotnet-demo-v1 \
--image=registry.cn-hangzhou.aliyuncs.com/yihan/dotnet6-demo:0.0.1 \
--replicas=3

 

第二种:用yaml文件部署deploy:

新建 dotnet-demo-v1-deply.yaml 文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: dotnet-demo-v1
spec:
  replicas: 3
  selector:
    matchLabels:
      app: dotnet-demo-v1
  template:
    metadata:
      labels:
        app: dotnet-demo-v1
    spec:
      imagePullSecrets:
      - name: aliyun-secret
      containers:
      - name: dotnet-demo-v1
        image: registry.cn-hangzhou.aliyuncs.com/yihan/dotnet6-demo:0.0.1
        ports:
        - containerPort: 80

 

部署deploy:

kubectl apply -f dotnet-demo-v1-deploy.yaml

 

查看 deploy是否部署成功

# 查看部署与pod
kubectl get deploy
kubectl get deploy,pods -l app=dotnet-demo-v1
# 校验密钥是否配置成功 
kubectl get deploy dotnet-demo-v1 -o yaml | grep imagePullSecrets

 

删除部署的deploy

kubectl delete deployment dotnet-demo-v1

 

【将Deployment暴露为Service】

Deployment 本身不能直接访问,需要搭配 Service 暴露 Pod 端口,分三种常用方式:ClusterIP (集群内部)、NodePort (节点端口访问)、LoadBalancer(阿里云集群公网负载均衡)。

两种方式部署Service。

第一种:纯命令行方式部署service:

kubectl expose deployment dotnet-demo-v1 --name=dotnet-demo-v1-svc --port=80 --target-port=80 --type=NodePort

打补丁,将 service的端口固定 nodePort=30092

kubectl patch svc dotnet-demo-v1-svc -p '{"spec":{"ports":[{"port":80,"targetPort":80,"nodePort":30092}]}}'

 

第二种:通过yaml文件方式部署service: 

新建dotnet-demo-v1-svc.yaml文件:

(1) ClusterIp方式:

apiVersion: v1
kind: Service
metadata:
  name: dotnet-demo-v1-svc
spec:
  selector:
    app: dotnet-demo-v1 # 和deployment标签一致
  ports:
  - port: 80         # service内部端口,多个 Service 完全可以都写 port:80,互不冲突!最好跟targetPort端口一致。
    targetPort: 80 # pod容器端口,比如redis是6379,sqlserver是1433,mysql是3306
  type: ClusterIP

 

(2)  NodePort方式

apiVersion: v1
kind: Service
metadata:
  name: dotnet-demo-v1-svc
spec:
  selector:
    app: dotnet-demo-v1
  ports:
  - port: 80         #service内部端口,多个 Service 完全可以都写 port:80,互不冲突!最好跟targetPort端口一致。
    targetPort: 80   #pod容器端口,比如redis是6379,sqlserver是1433,mysql是3306 
nodePort: 30092 #范围30000-32767 ,宿主机外网入口,同一个集群内所有 NodePort Service 的 nodePort 不能重复,全局唯一 ,只有NodePort模式才有这个配置,CluterIP模式没有。 type: NodePort

 

(3) LoadBalancer方式 

apiVersion: v1
kind: Service
metadata:
  name: dotnet-demo-v1-svc
spec:
  selector:
    app: dotnet-demo-v1
  ports:
  - port: 80              #service内部端口,多个 Service 完全可以都写 port:80,互不冲突!最好跟targetPort端口一致。
    targetPort: 80        #pod容器端口,比如redis是6379,sqlserver是1433,mysql是3306
  type: LoadBalancer

 

根据service的yaml文件创建service

kubectl apply -f dotnet-demo-v1-svc.yaml

 

常用校验命令

# 查看service
kubectl get svc dotnet-demo-v1-svc
# 查看service详情(匹配pod、端口、ip)
kubectl describe svc dotnet-demo-v1-svc
# 验证svc是否关联pod
kubectl get endpoints dotnet-demo-v1-svc

 

查看所有service

kubectl get svc

 

image

  

访问方式
集群内部 Pod 访问:curl dotnet-demo-v1-svc:80 或 dotnet-demo-v1-svc.default.svc.cluster.local:80
外部电脑 / 本机访问:http://任意集群节点IP:30092



# 获取pod名称
kubectl get pods -A | grep dotnet-demo

# 进入pod容器内部
kubectl exec -it pod名称 -- /bin/bash

apt update
apt install -y curl
#pod内部访问服务
curl dotnet-demo-v1-svc.default.svc.cluster.local:80

 

image

 在pod容器内部如果curl可以访问到 dotnet-demo-v1-svc 或 dotnet-demo-v1-svc.default.svc.cluster.local:80 ,说明dotnet-demo-v1-svc服务是通的。

注意: dotnet-demo-v1-svc.名称空间.svc.cluster.local:80 


【删除该 Service】

kubectl delete -f dotnet-demo-v1-svc.yaml

 

【安装Ingress组件】

清理之前按装的ingress

kubectl delete ns ingress-nginx --force --grace-period=0
kubectl get crd | grep ingress | awk '{print $1}' | xargs kubectl delete crd

 

安装K8s v1.26.15版(ingress v1.11.8 )

curl -o ingress-1.11.8.yaml https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.8/deploy/static/provider/baremetal/deploy.yaml
sed -i 's|registry.k8s.io|k8s.m.daocloud.io|g' ingress-1.11.8.yaml
kubectl apply -f ingress-1.11.8.yaml

 

安装K8s v1.33.6版(ingress v1.13.16)

curl -o ingress-1.13.6.yaml https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.13.6/deploy/static/provider/baremetal/deploy.yaml
sed -i 's|registry.k8s.io|k8s.m.daocloud.io|g' ingress-1.13.6.yaml
kubectl apply -f ingress-1.13.6.yaml

 

安装最新版ingress

#拉取官方部署文件,若打不开,就在本机浏览器里打开,然后把内容复制到yaml文件。
curl -o ingress-install.yaml https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/baremetal/deploy.yaml
#替换DaoCloud标准镜像域名替换
# sed -i 's|registry.k8s.io|m.daocloud.io/registry.k8s.io|g' ingress-install.yaml
sed -i 's|registry.k8s.io|k8s.m.daocloud.io|g' ingress-install.yaml
#部署
kubectl apply -f ingress-install.yaml

 

下载的 install-ingress.yaml文件安装的igress组件,默认对外暴露的端口是随机的,如果是指定ingress服务组件的端口,按照下面方式更改:

如果要修改为固定端口,固定 HTTP 端口 32590、HTTPS 32591

步骤 1:找到 ingress-nginx-controller Service 片段

搜索 kind: Service,名称为 ingress-nginx-controller,原始配置默认 type: LoadBalancer,无 nodePort:
apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.10.1
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - appProtocol: http
    name: http
    port: 80
    protocol: TCP
    targetPort: http
  - appProtocol: https
    name: https
    port: 443
    protocol: TCP
    targetPort: https
  selector:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  type: NodePort

 

步骤 2:修改三处

  1. type: LoadBalancertype: NodePort
  2. http 端口增加 nodePort: 30080
  3. https 端口增加 nodePort: 30443
apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.10.1
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - appProtocol: http
    name: http
    port: 80
    nodePort: 30080      #http端口
    protocol: TCP
    targetPort: http
  - appProtocol: https
    name: https
    port: 443
    nodePort: 30443     #https端口 
    protocol: TCP
    targetPort: https
  selector:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  type: NodePort   #NodePort类型

 

步骤 3:执行部署ingress组件

# k8s v1.26.x版本
# kubectl apply -f ingress-1.8.5.yaml
# k8s v1.33.x版本
kubectl apply -f ingress-1.10.1.yaml

 

image

查看ingress部署状态

# 查看ingress命名空间pod
kubectl get pods -n ingress-nginx
# 查看ingress对外service(自动分配NodePort 80/443端口)
kubectl get svc -n ingress-nginx
# 确认IngressClass存在(新版k8s必须)
kubectl get ingressclasses

 

【给 dotnet-demo-v1-svc 创建 Ingress规则 】 

先删除校验勾子,不删除创建不了ingress

kubectl delete ValidatingWebhookConfiguration ingress-nginx-admission --ignore-not-found

 如果不删除校验勾子,部署ingress规则会报如下错误:

Error from server (InternalError): error when creating "dotnet-demo-v1-ingress.yaml": Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": failed to call webhook: Post "https://ingress-nginx-controller-admission.ingress-nginx.svc:443/networking/v1/ingresses?timeout=10s": no endpoints available for service "ingress-nginx-controller-admission"

image

 

【修改ingress控制器对外端口】

1,先切换编辑器避免报错

export KUBE_EDITOR="nano"
kubectl edit svc ingress-nginx-controller -n ingress-nginx

 

2,找到 spec.ports 区域,示例默认配置:

spec:
  clusterIP: 10.96.3.243
  clusterIPs:
  - 10.96.3.243
  externalTrafficPolicy: Cluster
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - appProtocol: http
    name: http
    nodePort: 30080    #修改为你要对外的端口
    port: 80                 #service内部端口
    protocol: TCP
    targetPort: http
  - appProtocol: https
    name: https
    nodePort: 30443      #修改为你要对外的端口
    port: 443                 #service内部端口

 

直接修改 nodePort 数值(范围 30000-32767),保存退出即可,控制器自动滚动更新。

image

  

【添加ingress规则】

方式一:用纯命令部署ingress。

 

#带ip访问的版本(不绑定域名)
kubectl create ingress dotnet-demo-v1-ingress \
  --class=nginx \
  --rule="/*=dotnet-demo-v1-svc:80"

#带域名版本(如需绑定域名)
kubectl create ingress dotnet-demo-v1-ingress \
  --class=nginx \
  --rule="demo.test.com/*=dotnet-demo-v1-svc:80"

#输出 yaml 预览不创建(验证配置)
kubectl create ingress dotnet-demo-v1-ingress \
  --class=nginx \
  --rule="/*=dotnet-demo-v1-svc:80" \
  --dry-run=client -o yaml

 

方式二:使用ingress的yaml文件部署ingress。

新建dotnet-demo-v1-ingress.yaml文件,域名访问路径可以不加前缀/v1,ip访问路径需要加前缀 /v1,以免跟其它路径冲突。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: dotnet-demo-v1-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  ingressClassName: nginx
  rules:
  # 域名访问
  - host: demo-test.com
    http:
      paths:
      # 路径写在这里 /v1(/|$)(.*)
      - path: /v1(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: dotnet-demo-v1-svc
            port:
              number: 80
  # IP访问(无host,访问带NodePort端口)
  - http:
      paths:
      - path: /v1(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: dotnet-demo-v1-svc
            port:
              number: 80

 

部署 ingress 规则

kubectl apply -f dotnet-demo-v1-ingress.yaml

 

 

 查看 ingress 和对外访问端口

# 查看ingress规则
kubectl get ingress

# 查看ingress对外NodePort端口
kubectl get svc -n ingress-nginx

 

image

 从图上可以看出ingress对外的ip访问端口是 30080

在浏览器里访问:http://公网ip:30080/v1

如果用域名的方式配置的,同样需要加端口:http://你的域名:30080 

如果要修改Ingress使用80端口访问,参照 https://www.cnblogs.com/yyee/p/21913914 修改。

 

【删除这条 ingress】

kubectl delete ingress dotnet-demo-v1-ingress

 

posted @ 2026-07-14 06:33  民工黑猫  阅读(21)  评论(0)    收藏  举报