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

然后删除测试用的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

访问方式
集群内部 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

在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:修改三处
type: LoadBalancer→type: NodePort- http 端口增加
nodePort: 30080 - 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

查看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"

【修改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),保存退出即可,控制器自动滚动更新。

【添加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

从图上可以看出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

浙公网安备 33010602011771号