【问题标题】:How to change the default nodeport range on Mac (docker-desktop)?如何更改 Mac(docker-desktop)上的默认节点端口范围?
【发布时间】:2020-12-09 18:15:09
【问题描述】:

如何在 Mac (docker-desktop) 上更改默认节点端口范围?

我想更改 Mac 上的默认节点端口范围。可能吗?我很高兴找到这篇文章:http://www.thinkcode.se/blog/2019/02/20/kubernetes-service-node-port-range。由于在我的环境中找不到/etc/kubernetes/manifests/kube-apiserver.yaml,我尝试通过运行sudo kubectl edit pod kube-apiserver-docker-desktop --namespace=kube-system 并添加参数--service-node-port-range=443-22000 来实现我想要做的事情。但是当我试图保存它时,我得到了以下错误:

# pods "kube-apiserver-docker-desktop" was not valid:
# * spec: Forbidden: pod updates may not change fields other than `spec.containers[*].image`, `spec.initContainers[*].image`, `spec.activeDeadlineSeconds` or `spec.tolerations` (only additions to existing tolerations)

(即使我没有触摸端口 443,我也会遇到同样的错误。)有人可以分享他/她的想法或经验吗?谢谢!

追加:

skwok-mbp:kubernetes skwok$ kubectl get deployment -A
NAMESPACE       NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
docker          compose                    1/1     1            1           15d
docker          compose-api                1/1     1            1           15d
ingress-nginx   nginx-ingress-controller   1/1     1            1           37m
kube-system     coredns                    2/2     2            2           15d
skwok-mbp:kubernetes skwok$ kubectl get pod -A
NAMESPACE       NAME                                        READY   STATUS    RESTARTS   AGE
default         fortune-configmap-volume                    2/2     Running   4          14d
default         kubia-2qzmm                                 1/1     Running   2          15d
docker          compose-6c67d745f6-qqmpb                    1/1     Running   2          15d
docker          compose-api-57ff65b8c7-g8884                1/1     Running   4          15d
ingress-nginx   nginx-ingress-controller-756f65dd87-sq6lt   1/1     Running   0          37m
kube-system     coredns-fb8b8dccf-jn8cm                     1/1     Running   6          15d
kube-system     coredns-fb8b8dccf-t6qhs                     1/1     Running   6          15d
kube-system     etcd-docker-desktop                         1/1     Running   2          15d
kube-system     kube-apiserver-docker-desktop               1/1     Running   2          15d
kube-system     kube-controller-manager-docker-desktop      1/1     Running   29         15d
kube-system     kube-proxy-6nzqx                            1/1     Running   2          15d
kube-system     kube-scheduler-docker-desktop               1/1     Running   30         15d

【问题讨论】:

  • 这只是为了让您可以使用端口 443?在 443 上使用type: loadBalancer 设置服务。Docker for Mac 将为您设置。

标签: kubernetes


【解决方案1】:

更新:文档中的example 显示了一种在 Minikube 启动期间调整 apiserver 参数的方法:

minikube start --extra-config=apiserver.service-node-port-range=1-65535

--extra-config:一组key=value 对,描述可以传递给不同组件的配置。关键应该是'。分开,点之前的第一部分是应用配置的组件。有效组件为:kubeletapiservercontroller-manageretcdproxyschedulerlink

可用选项列表可在CLI documentation中找到


在 Mac 上更改 Docker-for-desktop 的 kube-apiserver 参数的另一种方法:

  1. 登录 Docker 虚拟机:

     $ screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
    
     #(you can also use privileged container for the same purpose)
     docker run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh
     #or
     docker run --rm -it --privileged --pid=host walkerlee/nsenter -t 1 -m -u -i -n sh
     # as suggested here: https://forums.docker.com/t/is-it-possible-to-ssh-to-the-xhyve-machine/17426/5
     # in case of minikube use the following command:
     $ minikube ssh
    
  2. 编辑 kube-apiserver.yaml(它是静态 pod 之一,它们是由 kubelet 使用 /etc/kubernetes/manifests 中的文件创建的)

     $ vi /etc/kubernetes/manifests/kube-apiserver.yaml
     # for minikube 
     $ sudo vi /etc/kubernetes/manifests/kube-apiserver.yaml
    
  3. 将以下行添加到 pod 规范中:

     spec:
       containers:
       - command:
         - kube-apiserver
         - --advertise-address=192.168.65.3
         ...
         - --service-node-port-range=443-22000   # <-- add this line
         ...
    
  4. 保存并退出。 Pod kube-apiserver 将使用新参数重新启动。

  5. 退出 Docker 虚拟机(对于 screenCtrl-a,k,对于容器:Ctrl-d

检查结果:

$ kubectl get pod kube-apiserver-docker-desktop -o yaml -n kube-system | less

创建简单的部署并使用服务公开它:

$ kubectl run nginx1 --image=nginx --replicas=2
$ kubectl expose deployment nginx1 --port 80 --type=NodePort
$ kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        14d
nginx1       NodePort    10.99.173.234   <none>        80:14966/TCP   5s

如您所见,NodePort 是从新范围中选择的。

还有其他ways 可以公开您的容器:HostNetwork, HostPortMetalLB

您需要为此添加正确的security context,例如,查看 minikube 中的 ingress 插件的工作原理。

...
ports:
- containerPort: 80
  hostPort: 80
  protocol: TCP
- containerPort: 443
  hostPort: 443
  protocol: TCP
...
securityContext:
  capabilities:
    add:
    - NET_BIND_SERVICE
    drop:
    - ALL

【讨论】:

  • 非常感谢您的这篇精彩文章,VAS。这是超级有用和专业的!
  • 我在这里试过了,但是没有用。一旦 apiserver 重新启动,任何带有 NodePort 的服务都会停止工作,拒绝连接:/
  • 请发布一个单独的问题来描述产品版本,结束您所做的确切更改,以便进行调查。
  • 一些关于连接到 docker-desktop vm 的更新:gist.github.com/BretFisher/5e1a0c7bcca4c735e716abf62afad389
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 2021-02-20
  • 1970-01-01
  • 2015-05-24
  • 2016-11-02
  • 2011-10-19
相关资源
最近更新 更多