更改 Kubernetes nginx-ingress-controller 端口
Change Kubernetes nginx-ingress-controller ports
我在我的 RedHat EC2 实例上安装了 Minikube v1.3.1 用于一些测试。
由于nginx-ingress-controller默认使用的端口已经被使用,我试图在部署中更改它们但没有结果。有人可以告诉我怎么做吗?
我如何知道该端口已被使用?
当我使用命令 kubectl -n kube-system get deployment | grep nginx
列出系统 pods 时,我得到:
nginx-ingress-controller 0/1 1 0 9d
意思是我的容器没有启动。当我使用命令 kubectl -n kube-system describe pod nginx-ingress-controller-xxxxx
描述它时,我得到:
Type Reason Age From
Message ---- ------ ----
---- ------- Warning FailedCreatePodSandBox 42m (x163507 over 2d1h) kubelet, minikube (combined from similar
events): Failed create pod sandbox: rpc error: code = Unknown desc =
failed to start sandbox container for pod
"nginx-ingress-controller-xxxx": Error response from daemon: driver
failed programming external connectivity on endpoint
k8s_POD_nginx-ingress-controller-xxxx_kube-system_...: Error starting
userland proxy: listen tcp 0.0.0.0:443: bind: address already in use
然后我检查使用这些端口的进程并杀死它们。这释放了它们并且 ingress-controller pod 得到正确部署。
我尝试更改 nginx-ingress-controller 端口的原因是什么?
kubectl -n kube-system get deployment | grep nginx
> NAME READY UP-TO-DATE AVAILABLE AGE
> nginx-ingress-controller 0/1 1 0 9d
kubectl -n kube-system edit deployment nginx-ingress-controller
我部署的相关部分如下所示:
name: nginx-ingress-controller
ports:
- containerPort: 80
hostPort: 80
protocol: TCP
- containerPort: 443
hostPort: 443
protocol: TCP
- containerPort: 81
hostPort: 81
protocol: TCP
- containerPort: 444
hostPort: 444
protocol: TCP
- containerPort: 18080
hostPort: 18080
protocol: TCP
然后我删除了带有端口 443 和 80 的子部分,但是当我推出更改时,它们又被添加了。
现在无法再通过入口访问我的服务。
基本上,minikube
引导 Nginx Ingress Controller 作为单独的插件,因此根据设计,您可能必须启用它才能传播特定的 Ingress Controller minikube
集群中的资源。
一旦你启用了一些特定的 minikube
Addon, Addon-manager 通过将它们放入主机上的 /etc/kubernetes/addons/
文件夹中为每个组件创建模板文件,然后启动每个清单文件,创建对应的K8s资源;此外 Addon-manager 根据模板数据不断检查同步 K8s 目标资源(服务、部署等)的所有插件资源的实际状态.
因此,您可以考虑在 /etc/kubernetes/addons/
目录下的 ingress-*.yaml
文件中修改 Ingress 插件模板数据,将所需值传播到目标 k8s 对象中;在 K8s 引擎反映更改并重新生成相对 ReplicaSet 基于资源之前,可能需要一些时间。
嗯,我认为你必须修改 Ingress,它引用你试图在自定义端口上公开的服务。
这可以通过自定义注释来完成。这是您的端口 444 的示例:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: myservice
namespace: mynamespace
annotations:
kubernetes.io/ingress.class: nginx
nginx.org/listen-ports-ssl: "444"
spec:
tls:
- hosts:
- host.org
secretName: my-host-tls-cert
rules:
- host: host.org
http:
paths:
- path: /
backend:
serviceName: my-service
servicePort: 444
请注意 minikube 附带 addon-manager,其作用是关注特定的插件模板文件(默认位置:/etc/kubernetes/addons/
)和根据托管资源的标签值执行两个特定操作之一:
addonmanager.kubernetes.io/mode
addonmanager.kubernetes.io/mode=Reconcile
Will be periodically reconciled. Direct manipulation to these addons
through apiserver is discouraged because addon-manager will bring
them back to the original state. In particular
addonmanager.kubernetes.io/mode=KeepOnly
Will be checked for existence only. Users can edit these addons as
they want.
因此,为了保留您自定义版本的默认 Ingress 服务侦听端口,请先将 minikube VM 上的 Ingress deployment template configuration 更改为 KeepOnly
。
我在我的 RedHat EC2 实例上安装了 Minikube v1.3.1 用于一些测试。
由于nginx-ingress-controller默认使用的端口已经被使用,我试图在部署中更改它们但没有结果。有人可以告诉我怎么做吗?
我如何知道该端口已被使用?
当我使用命令 kubectl -n kube-system get deployment | grep nginx
列出系统 pods 时,我得到:
nginx-ingress-controller 0/1 1 0 9d
意思是我的容器没有启动。当我使用命令 kubectl -n kube-system describe pod nginx-ingress-controller-xxxxx
描述它时,我得到:
Type Reason Age From
Message ---- ------ ----
---- ------- Warning FailedCreatePodSandBox 42m (x163507 over 2d1h) kubelet, minikube (combined from similar events): Failed create pod sandbox: rpc error: code = Unknown desc = failed to start sandbox container for pod "nginx-ingress-controller-xxxx": Error response from daemon: driver failed programming external connectivity on endpoint k8s_POD_nginx-ingress-controller-xxxx_kube-system_...: Error starting userland proxy: listen tcp 0.0.0.0:443: bind: address already in use
然后我检查使用这些端口的进程并杀死它们。这释放了它们并且 ingress-controller pod 得到正确部署。
我尝试更改 nginx-ingress-controller 端口的原因是什么?
kubectl -n kube-system get deployment | grep nginx
> NAME READY UP-TO-DATE AVAILABLE AGE
> nginx-ingress-controller 0/1 1 0 9d
kubectl -n kube-system edit deployment nginx-ingress-controller
我部署的相关部分如下所示:
name: nginx-ingress-controller
ports:
- containerPort: 80
hostPort: 80
protocol: TCP
- containerPort: 443
hostPort: 443
protocol: TCP
- containerPort: 81
hostPort: 81
protocol: TCP
- containerPort: 444
hostPort: 444
protocol: TCP
- containerPort: 18080
hostPort: 18080
protocol: TCP
然后我删除了带有端口 443 和 80 的子部分,但是当我推出更改时,它们又被添加了。
现在无法再通过入口访问我的服务。
基本上,minikube
引导 Nginx Ingress Controller 作为单独的插件,因此根据设计,您可能必须启用它才能传播特定的 Ingress Controller minikube
集群中的资源。
一旦你启用了一些特定的 minikube
Addon, Addon-manager 通过将它们放入主机上的 /etc/kubernetes/addons/
文件夹中为每个组件创建模板文件,然后启动每个清单文件,创建对应的K8s资源;此外 Addon-manager 根据模板数据不断检查同步 K8s 目标资源(服务、部署等)的所有插件资源的实际状态.
因此,您可以考虑在 /etc/kubernetes/addons/
目录下的 ingress-*.yaml
文件中修改 Ingress 插件模板数据,将所需值传播到目标 k8s 对象中;在 K8s 引擎反映更改并重新生成相对 ReplicaSet 基于资源之前,可能需要一些时间。
嗯,我认为你必须修改 Ingress,它引用你试图在自定义端口上公开的服务。
这可以通过自定义注释来完成。这是您的端口 444 的示例:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: myservice
namespace: mynamespace
annotations:
kubernetes.io/ingress.class: nginx
nginx.org/listen-ports-ssl: "444"
spec:
tls:
- hosts:
- host.org
secretName: my-host-tls-cert
rules:
- host: host.org
http:
paths:
- path: /
backend:
serviceName: my-service
servicePort: 444
请注意 minikube 附带 addon-manager,其作用是关注特定的插件模板文件(默认位置:/etc/kubernetes/addons/
)和根据托管资源的标签值执行两个特定操作之一:
addonmanager.kubernetes.io/mode
addonmanager.kubernetes.io/mode=Reconcile
Will be periodically reconciled. Direct manipulation to these addons through apiserver is discouraged because addon-manager will bring them back to the original state. In particular
addonmanager.kubernetes.io/mode=KeepOnly
Will be checked for existence only. Users can edit these addons as they want.
因此,为了保留您自定义版本的默认 Ingress 服务侦听端口,请先将 minikube VM 上的 Ingress deployment template configuration 更改为 KeepOnly
。