我在RedHat EC2实例上安装了Minikube v1.3.1,以进行一些测试。
由于nginx-ingress-controller默认使用的端口已在使用中,因此我试图在部署中更改它们,但没有结果。
我如何知道该端口已在使用中?
当我使用命令kubectl -n kube-system get deployment | grep nginx
列出系统Pod时,我得到:
nginx-ingress-controller 0/1 1 0 9d
表示我的容器没有用完。当我使用命令kubectl -n kube-system describe pod nginx-ingress-controller-xxxxx
描述它时,我得到:
键入原因年龄自
消息---- ------ ----
---- -------警告FailedCreatePodSandBox 42m(x163507超过2d1h)kubelet,minikube(类似 事件):创建Pod沙箱失败:rpc错误:代码=未知desc = 无法启动Pod的沙盒容器 “ nginx-ingress-controller-xxxx”:来自守护程序的错误响应:驱动程序 端点上的外部连接编程失败 k8s_POD_nginx-入口控制器-xxxx_kube-system _...:启动错误 userland代理:监听tcp 0.0.0.0:443:绑定:地址已在使用中
然后,我使用这些端口检查进程并杀死它们。这样可以释放它们,并且可以正确部署入口控制器吊舱。
我试图更改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的小节,但是当我推出更改时,它们又被添加。
现在我的服务无法通过入口访问。
答案 0 :(得分:1)
请注意,minikube 附带 addon-manager,其作用是关注特定的插件模板文件(默认位置:/etc/kubernetes/addons/
)并执行两个特定的基于管理资源标签值的操作:
addonmanager.kubernetes.io/mode
addonmanager.kubernetes.io/mode=Reconcile
会定期对账。直接操作这些插件 不鼓励通过 apiserver,因为 addon-manager 会带来 他们回到原来的状态。特别是
addonmanager.kubernetes.io/mode=KeepOnly
将仅检查是否存在。用户可以将这些插件编辑为 他们想要。
因此,要保留您自定义版本的默认 Ingress 服务侦听端口,请先将 minikube VM 上的 Ingress deployment template configuration 更改为 KeepOnly
。
答案 1 :(得分:0)
基本上,MySQL
引导Nginx Ingress Controller作为单独的插件,因此,根据设计,您可能必须启用它才能在{内传播特定的 Ingress Controller的资源。 {1}}集群。
一旦启用了某些特定的minikube
Addon,Addon-manager就会通过将每个文件放置到主机上的minikube
文件夹中来为每个组件创建模板文件,清单文件,创建相应的K8s资源;此外,插件管理器会根据模板数据连续检查与 K8s 目标资源(服务,部署等)同步的所有插件资源的实际状态。
因此,您可以考虑在minikube
目录下的整个/etc/kubernetes/addons/
文件中修改 Ingress 插件模板数据,将所需的值传播到目标k8s对象中;直到K8s引擎反映出更改并重新生成基于ReplicaSet的相对资源为止,可能要花一些时间。
答案 2 :(得分:0)
好吧,我认为您必须修改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