一、部署前准备
1. 配置私有仓库 HTTP 加速与 insecure-registries
因为你的镜像仓库是 HTTP 的 192.168.57.200:8099,需要在每个节点的 Docker 里配置 daemon.json。
#### 1.1 编辑 daemon.json
sudo tee /etc/docker/daemon.json > /dev/null <<'EOF'
{
"registry-mirrors": [
"https://0flxnlct2crdwm8pmt.xuanyuan.dev",
"https://docker.m.daocloud.io",
"https://docker.1ms.run"
],
"insecure-registries": [
"192.168.57.200:8099"
],
"exec-opts": [
"native.cgroupdriver=systemd"
]
}
EOF1.2 重启 Docker
改完 daemon.json 必须重启 Docker 才生效:
sudo systemctl daemon-reload
sudo systemctl restart docker1.3 验证配置是否生效
docker info | grep -A 5 "Insecure Registries"
docker info | grep -A 5 "Registry Mirrors"能看 192.168.57.200:8099 和镜像加速地址即可。
注意:K8s 如果用的是 containerd,而不是 Docker,那要改的是
/etc/containerd/config.toml,然后systemctl restart containerd。你这里写的是daemon.json,所以按 Docker 处理。
二、安装 Ingress-Nginx
1. 创建 Ingress-Nginx 部署文件
vim Ingress-Nginx-deploy.yaml
# 填写以下内容
apiVersion: v1
kind: Namespace
metadata:
labels:
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
name: ingress-nginx
---
apiVersion: v1
automountServiceAccountToken: true
kind: ServiceAccount
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.6.3
name: ingress-nginx
namespace: ingress-nginx
---
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
app.kubernetes.io/component: admission-webhook
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.6.3
name: ingress-nginx-admission
namespace: ingress-nginx
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
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.6.3
name: ingress-nginx
namespace: ingress-nginx
rules:
- apiGroups:
- ""
resources:
- namespaces
verbs:
- get
- apiGroups:
- ""
resources:
- configmaps
- pods
- secrets
- endpoints
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- services
verbs:
- get
- list
- watch
- apiGroups:
- networking.k8s.io
resources:
- ingresses
verbs:
- get
- list
- watch
- apiGroups:
- networking.k8s.io
resources:
- ingresses/status
verbs:
- update
- apiGroups:
- networking.k8s.io
resources:
- ingressclasses
verbs:
- get
- list
- watch
- apiGroups:
- coordination.k8s.io
resourceNames:
- ingress-nginx-leader
resources:
- leases
verbs:
- get
- update
- apiGroups:
- coordination.k8s.io
resources:
- leases
verbs:
- create
- apiGroups:
- ""
resources:
- events
verbs:
- create
- patch
- apiGroups:
- discovery.k8s.io
resources:
- endpointslices
verbs:
- list
- watch
- get
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
labels:
app.kubernetes.io/component: admission-webhook
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.6.3
name: ingress-nginx-admission
namespace: ingress-nginx
rules:
- apiGroups:
- ""
resources:
- secrets
verbs:
- get
- create
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.6.3
name: ingress-nginx
rules:
- apiGroups:
- ""
resources:
- configmaps
- endpoints
- nodes
- pods
- secrets
- namespaces
verbs:
- list
- watch
- apiGroups:
- coordination.k8s.io
resources:
- leases
verbs:
- list
- watch
- apiGroups:
- ""
resources:
- nodes
verbs:
- get
- apiGroups:
- ""
resources:
- services
verbs:
- get
- list
- watch
- apiGroups:
- networking.k8s.io
resources:
- ingresses
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- events
verbs:
- create
- patch
- apiGroups:
- networking.k8s.io
resources:
- ingresses/status
verbs:
- update
- apiGroups:
- networking.k8s.io
resources:
- ingressclasses
verbs:
- get
- list
- watch
- apiGroups:
- discovery.k8s.io
resources:
- endpointslices
verbs:
- list
- watch
- get
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
app.kubernetes.io/component: admission-webhook
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.6.3
name: ingress-nginx-admission
rules:
- apiGroups:
- admissionregistration.k8s.io
resources:
- validatingwebhookconfigurations
verbs:
- get
- update
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
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.6.3
name: ingress-nginx
namespace: ingress-nginx
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: ingress-nginx
subjects:
- kind: ServiceAccount
name: ingress-nginx
namespace: ingress-nginx
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
labels:
app.kubernetes.io/component: admission-webhook
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.6.3
name: ingress-nginx-admission
namespace: ingress-nginx
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: ingress-nginx-admission
subjects:
- kind: ServiceAccount
name: ingress-nginx-admission
namespace: ingress-nginx
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
labels:
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.6.3
name: ingress-nginx
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: ingress-nginx
subjects:
- kind: ServiceAccount
name: ingress-nginx
namespace: ingress-nginx
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
labels:
app.kubernetes.io/component: admission-webhook
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.6.3
name: ingress-nginx-admission
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: ingress-nginx-admission
subjects:
- kind: ServiceAccount
name: ingress-nginx-admission
namespace: ingress-nginx
---
apiVersion: v1
data:
allow-snippet-annotations: "true"
kind: ConfigMap
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.6.3
name: ingress-nginx-controller
namespace: ingress-nginx
---
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.6.3
name: ingress-nginx-controller
namespace: ingress-nginx
spec:
externalTrafficPolicy: Local
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: LoadBalancer
---
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.6.3
name: ingress-nginx-controller-admission
namespace: ingress-nginx
spec:
ports:
- appProtocol: https
name: https-webhook
port: 443
targetPort: webhook
selector:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
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.6.3
name: ingress-nginx-controller
namespace: ingress-nginx
spec:
minReadySeconds: 0
revisionHistoryLimit: 10
selector:
matchLabels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
template:
metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
spec:
containers:
- args:
- /nginx-ingress-controller
- --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller
- --election-id=ingress-nginx-leader
- --controller-class=k8s.io/ingress-nginx
- --ingress-class=nginx
- --configmap=$(POD_NAMESPACE)/ingress-nginx-controller
- --validating-webhook=:8443
- --validating-webhook-certificate=/usr/local/certificates/cert
- --validating-webhook-key=/usr/local/certificates/key
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: LD_PRELOAD
value: /usr/local/lib/libmimalloc.so
image: 192.168.57.200:8099/ingress-nginx/controller:v1.6.3
imagePullPolicy: IfNotPresent
lifecycle:
preStop:
exec:
command:
- /wait-shutdown
livenessProbe:
failureThreshold: 5
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
name: controller
ports:
- containerPort: 80
name: http
protocol: TCP
- containerPort: 443
name: https
protocol: TCP
- containerPort: 8443
name: webhook
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
resources:
requests:
cpu: 100m
memory: 90Mi
securityContext:
allowPrivilegeEscalation: true
capabilities:
add:
- NET_BIND_SERVICE
drop:
- ALL
runAsUser: 101
volumeMounts:
- mountPath: /usr/local/certificates/
name: webhook-cert
readOnly: true
dnsPolicy: ClusterFirst
nodeSelector:
kubernetes.io/os: linux
serviceAccountName: ingress-nginx
terminationGracePeriodSeconds: 300
volumes:
- name: webhook-cert
secret:
secretName: ingress-nginx-admission
---
apiVersion: batch/v1
kind: Job
metadata:
labels:
app.kubernetes.io/component: admission-webhook
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.6.3
name: ingress-nginx-admission-create
namespace: ingress-nginx
spec:
template:
metadata:
labels:
app.kubernetes.io/component: admission-webhook
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.6.3
name: ingress-nginx-admission-create
spec:
containers:
- args:
- create
- --host=ingress-nginx-controller-admission,ingress-nginx-controller-admission.$(POD_NAMESPACE).svc
- --namespace=$(POD_NAMESPACE)
- --secret-name=ingress-nginx-admission
env:
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
image: 192.168.57.200:8099/ingress-nginx/kube-webhook-certgen:v20220916-gd32f8c343
imagePullPolicy: IfNotPresent
name: create
securityContext:
allowPrivilegeEscalation: false
nodeSelector:
kubernetes.io/os: linux
restartPolicy: OnFailure
securityContext:
fsGroup: 2000
runAsNonRoot: true
runAsUser: 2000
serviceAccountName: ingress-nginx-admission
---
apiVersion: batch/v1
kind: Job
metadata:
labels:
app.kubernetes.io/component: admission-webhook
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.6.3
name: ingress-nginx-admission-patch
namespace: ingress-nginx
spec:
template:
metadata:
labels:
app.kubernetes.io/component: admission-webhook
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.6.3
name: ingress-nginx-admission-patch
spec:
containers:
- args:
- patch
- --webhook-name=ingress-nginx-admission
- --namespace=$(POD_NAMESPACE)
- --patch-mutating=false
- --secret-name=ingress-nginx-admission
- --patch-failure-policy=Fail
env:
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
image: 192.168.57.200:8099/ingress-nginx/kube-webhook-certgen:v20220916-gd32f8c343
imagePullPolicy: IfNotPresent
name: patch
securityContext:
allowPrivilegeEscalation: false
nodeSelector:
kubernetes.io/os: linux
restartPolicy: OnFailure
securityContext:
fsGroup: 2000
runAsNonRoot: true
runAsUser: 2000
serviceAccountName: ingress-nginx-admission
---
apiVersion: networking.k8s.io/v1
kind: IngressClass
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.6.3
name: nginx
spec:
controller: k8s.io/ingress-nginx
---
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
labels:
app.kubernetes.io/component: admission-webhook
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.6.3
name: ingress-nginx-admission
webhooks:
- admissionReviewVersions:
- v1
clientConfig:
service:
name: ingress-nginx-controller-admission
namespace: ingress-nginx
path: /networking/v1/ingresses
failurePolicy: Fail
matchPolicy: Equivalent
name: validate.nginx.ingress.kubernetes.io
rules:
- apiGroups:
- networking.k8s.io
apiVersions:
- v1
operations:
- CREATE
- UPDATE
resources:
- ingresses
sideEffects: None
2. 应用 YAML
kubectl apply -f Ingress-Nginx-deploy.yaml3. 查看安装结果
3.1 查看 namespace
kubectl get ns应该能看到 ingress-nginx。
3.2 查看 Pod
kubectl get pods -n ingress-nginx -o wide重点看:
ingress-nginx-controller-xxx是否Runningingress-nginx-admission-create-xxx是否Completedingress-nginx-admission-patch-xxx是否Completed
3.3 查看 Service
kubectl get svc -n ingress-nginx应该能看到:
ingress-nginx-controller,类型LoadBalanceringress-nginx-controller-admission,类型ClusterIP
3.4 查看 IngressClass
kubectl get ingressclass应该能看到 nginx。
3.5 查看 controller 详细信息
kubectl describe pod -n ingress-nginx -l app.kubernetes.io/component=controller如果 Pod 起不来,重点看 Events。
三、部署测试应用 Nginx 和 Tomcat
1. 创建 nginx-deployment.yaml
vim nginx-deployment.yaml内容:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80应用:
kubectl apply -f nginx-deployment.yaml2. 创建 tomcat-deployment.yaml
vim tomcat-deployment.yaml内容:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: tomcat
name: tomcat
spec:
replicas: 3
selector:
matchLabels:
app: tomcat
template:
metadata:
labels:
app: tomcat
spec:
containers:
- image: tomcat:9
name: tomcat应用:
kubectl apply -f tomcat-deployment.yaml3. 查看 Pod 是否 Running
kubectl get pods -o wide应该看到 3 个 nginx Pod 和 3 个 tomcat Pod。
如果镜像拉取失败,检查:
kubectl describe pod <pod-name>看 Events 里是不是 ImagePullBackOff,如果是,回到第一步检查 daemon.json 和 Docker 重启。
四、创建 Service
1. 创建 service.yaml
vim service.yaml内容:
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
labels:
app: nginx
spec:
type: LoadBalancer
selector:
app: nginx
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: tomcat-svc
labels:
app: tomcat
spec:
type: LoadBalancer
selector:
app: tomcat
ports:
- name: http
port: 8080
targetPort: 8080
protocol: TCP应用:
kubectl apply -f service.yaml2. 查看 Service
kubectl get svc应该看到 nginx-svc 和 tomcat-svc,类型 LoadBalancer。
3. 查看 Endpoints
这是排查 Service 有没有正确关联到 Pod 的关键:
kubectl get endpoints nginx-svc tomcat-svc如果 ENDPOINTS 是 <none>,说明:
Service 的
selector和 Pod 的labels对不上或者 Pod 没 Ready
用下面命令对照:
kubectl get pods --show-labels
kubectl describe svc nginx-svc
kubectl describe svc tomcat-svc五、创建 Ingress 规则
1. 创建 Ingress.yaml
vim Ingress.yaml内容:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: api-ingress
spec:
ingressClassName: nginx
rules:
- host: nginx.test.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-svc
port:
number: 80
- host: tomcat.test.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: tomcat-svc
port:
number: 8080应用:
kubectl apply -f Ingress.yaml2. 查看 Ingress
kubectl get ingress
kubectl get ingress -A3. 查看某个 Ingress 完整 YAML
kubectl get ingress api-ingress -o yaml六、配置 hosts 并验证访问
1. 查看 Ingress Controller 对外 IP / 端口
kubectl get svc -n ingress-nginx看 ingress-nginx-controller 的 EXTERNAL-IP 和 PORT(S)。
如果是 LoadBalancer 且没有 MetalLB,EXTERNAL-IP 可能是 <pending>。 这时可以先用节点 IP + NodePort 访问,或者先改 externalTrafficPolicy。
2. 查看 externalTrafficPolicy
kubectl get svc -n ingress-nginx ingress-nginx-controller -o yaml | grep -i externalTrafficPolicy如果是 Local,只有 Pod 所在节点才监听。 如果想让三个节点都监听,可以改成 Cluster:
kubectl patch svc -n ingress-nginx ingress-nginx-controller -p '{"spec":{"externalTrafficPolicy":"Cluster"}}'3. 修改本机 hosts
Windows:
C:\Windows\System32\drivers\etc\hosts加两行(把 节点IP 换成你实际节点 IP):
节点IP nginx.test.com
节点IP tomcat.test.com4. 测试访问
浏览器访问:
http://nginx.test.com
http://tomcat.test.com或者命令行:
curl -I http://nginx.test.com
curl -I http://tomcat.test.com七、MetalLB(可选,未完成部分)
你的笔记里写了 MetalLB,但标注“未完成”。 如果想让 LoadBalancer 类型的 Service 真正拿到外部 IP,可以装 MetalLB。
1. 安装 MetalLB
kubectl apply -f https://ghproxy.net/https://raw.githubusercontent.com/metallb/metallb/v0.16.1/config/manifests/metallb-native.yaml2. 查看 MetalLB Pod
kubectl get pods -n metallb-system -o wide3. 配置 IP 地址池(示例)
vim metallb-config.yaml内容示例(把 192.168.57.240-192.168.57.250 换成你实际可用 IP 段):
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: default-pool
namespace: metallb-system
spec:
addresses:
- 192.168.7.75-192.168.7.79
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: default
namespace: metallb-system
spec:
ipAddressPools:
- default-pool应用:
kubectl apply -f metallb-config.yaml然后再看:
kubectl get svc -n ingress-nginx
kubectl get svcEXTERNAL-IP 应该不再是 <pending>。
八、常用指令汇总
节点
kubectl get nodes -o wide
kubectl describe node <node-name>Pod
kubectl get pods -o wide
kubectl get pods -A -o wide
kubectl get pods -n ingress-nginx -o wideService
kubectl get svc
kubectl get svc -A
kubectl get svc -n ingress-nginxIngress
kubectl get ingress
kubectl get ingress -A
kubectl get ingress api-ingress -o yamlEndpoints
kubectl get endpoints
kubectl get endpoints nginx-svc tomcat-svcIngressClass
kubectl get ingressclassexternalTrafficPolicy
kubectl get svc -n ingress-nginx ingress-nginx-controller -o yaml | grep -i externalTrafficPolicy
kubectl patch svc -n ingress-nginx ingress-nginx-controller -p '{"spec":{"externalTrafficPolicy":"Cluster"}}'Controller Pod 状态
kubectl get pods -n ingress-nginx -o wide
kubectl describe pod -n ingress-nginx -l app.kubernetes.io/component=controller九、排错思路速记
访问不通时,按这个顺序查:
1. ping 域名
→ 检查 hosts 解析对不对
2. ping 节点 IP
→ 检查网络通不通
3. Test-NetConnection IP -Port 端口
→ 检查端口通不通
4. 端口不通
→ 查 externalTrafficPolicy / ufw / Pod 所在节点
5. 端口通但页面错
→ 查 Ingress 规则 / Service Endpoints / Pod 日志对应 kubectl 命令:
# 1. hosts 解析
ping nginx.test.com
# 2. 节点网络
ping <节点IP>
# 3. 端口
telnet <节点IP> <端口>
# 或 Windows PowerShell:
Test-NetConnection <节点IP> -Port <端口>
# 4. externalTrafficPolicy
kubectl get svc -n ingress-nginx ingress-nginx-controller -o yaml | grep -i externalTrafficPolicy
# 5. Ingress 规则
kubectl get ingress api-ingress -o yaml
# 6. Endpoints
kubectl get endpoints nginx-svc tomcat-svc
# 7. Pod 日志
kubectl logs -n ingress-nginx -l app.kubernetes.io/component=controller
kubectl logs <pod-name>十、完整操作顺序(照着敲)
# 1. 每个节点配置 daemon.json
sudo vim /etc/docker/daemon.json
# 写入 registry-mirrors + insecure-registries
sudo systemctl daemon-reload
sudo systemctl restart docker
# 2. 安装 Ingress-Nginx
vim Ingress-Nginx-deploy.yaml
kubectl apply -f Ingress-Nginx-deploy.yaml
kubectl get pods -n ingress-nginx -o wide
kubectl get svc -n ingress-nginx
kubectl get ingressclass
# 3. 部署 Nginx 和 Tomcat
vim nginx-deployment.yaml
kubectl apply -f nginx-deployment.yaml
vim tomcat-deployment.yaml
kubectl apply -f tomcat-deployment.yaml
kubectl get pods -o wide
# 4. 创建 Service
vim service.yaml
kubectl apply -f service.yaml
kubectl get svc
kubectl get endpoints nginx-svc tomcat-svc
# 5. 创建 Ingress
vim Ingress.yaml
kubectl apply -f Ingress.yaml
kubectl get ingress
kubectl get ingress api-ingress -o yaml
# 6. 改 hosts 并访问
sudo vim /etc/hosts
# 加 节点IP nginx.test.com
# 加 节点IP tomcat.test.com
curl -I http://nginx.test.com
curl -I http://tomcat.test.com
# 7. 如果不通,排错
kubectl get svc -n ingress-nginx ingress-nginx-controller -o yaml | grep -i externalTrafficPolicy
kubectl patch svc -n ingress-nginx ingress-nginx-controller -p '{"spec":{"externalTrafficPolicy":"Cluster"}}'
kubectl logs -n ingress-nginx -l app.kubernetes.io/component=controllerK8s的lngress简易安装及操作使用
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法