Как запустить службу kubernetes на NodePort вне диапазона по умолчанию для диапазона-порта-узла-службы?

Я безуспешно пытался запустить kubernetes-dashboard (и, возможно, другие службы) на NodePort за пределами диапазона портов по умолчанию, вот моя настройка: облачный провайдер: Azure (не служба контейнеров Azure) ОС: CentOS 7

вот что я пробовал:

Обновите хост

$ yum update

Установите kubeadm

$ cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://yum.kubernetes.io/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
       https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
$ setenforce 0
$ yum install -y docker kubelet kubeadm kubectl kubernetes-cni
$ systemctl enable docker && systemctl start docker
$ systemctl enable kubelet && systemctl start kubelet

Запустите кластер с помощью kubeadm

$ kubeadm init

Разрешить запуск контейнеров на главном узле, потому что у нас есть кластер с одним узлом

$ kubectl taint nodes --all dedicated-

Установить сеть подов

$ kubectl apply -f https://git.io/weave-kube

Развертывание нашей панели управления kubernetes (@ ~ / kubernetes-dashboard.yaml

# Copyright 2015 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or     implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Configuration to deploy release version of the Dashboard UI.
#
# Example usage: kubectl create -f <this_file>

kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  labels:
    app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kubernetes-dashboard
  template:
    metadata:
      labels:
        app: kubernetes-dashboard
      # Comment the following annotation if Dashboard must not be deployed on master
      annotations:
        scheduler.alpha.kubernetes.io/tolerations: |
          [
            {
              "key": "dedicated",
              "operator": "Equal",
              "value": "master",
              "effect": "NoSchedule"
            }
          ]
    spec:
      containers:
      - name: kubernetes-dashboard
        image: gcr.io/google_containers/kubernetes-dashboard-amd64:v1.5.1
        imagePullPolicy: Always
        ports:
        - containerPort: 9090
          protocol: TCP
        args:
          # Uncomment the following line to manually specify Kubernetes API server Host
          # If not specified, Dashboard will attempt to auto discover the API server and connect
          # to it. Uncomment only if the default does not work.
          # - --apiserver-host=http://my-address:port
        livenessProbe:
          httpGet:
            path: /
            port: 9090
          initialDelaySeconds: 30
          timeoutSeconds: 30
---
kind: Service
apiVersion: v1
metadata:
  labels:
    app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  type: NodePort
  ports:
  - port: 8880
    targetPort: 9090
    nodePort: 8880
  selector:
    app: kubernetes-dashboard

Создайте наше развертывание

$ kubectl create -f ~/kubernetes-dashboard.yaml
deployment "kubernetes-dashboard" created
The Service "kubernetes-dashboard" is invalid: spec.ports[0].nodePort: Invalid value: 8880: provided port is not in the valid range. The range of valid ports is 30000-32767

Я обнаружил, что для изменения диапазона допустимых портов я могу установить параметр service-node-port-range на kube-apiserver, чтобы разрешить другой диапазон портов, поэтому я попробовал следующее:

$ kubectl get po --namespace=kube-system
NAME                                    READY     STATUS    RESTARTS       AGE
dummy-2088944543-lr2zb                  1/1       Running   0              31m
etcd-test2-highr                        1/1       Running   0              31m
kube-apiserver-test2-highr              1/1       Running   0              31m
kube-controller-manager-test2-highr     1/1       Running   2              31m
kube-discovery-1769846148-wmbhb         1/1       Running   0              31m
kube-dns-2924299975-8vwjm               4/4       Running   0              31m
kube-proxy-0ls9c                        1/1       Running   0              31m
kube-scheduler-test2-highr              1/1       Running   2              31m
kubernetes-dashboard-3203831700-qrvdn   1/1       Running   0              22s
weave-net-m9rxh                         2/2       Running   0              31m

Добавьте "--service-node-port-range = 8880-8880" в kube-apiserver-test2-highr

$ kubectl edit po kube-apiserver-test2-highr --namespace=kube-system
{
  "kind": "Pod",
  "apiVersion": "v1",
  "metadata": {
    "name": "kube-apiserver",
    "namespace": "kube-system",
    "creationTimestamp": null,
    "labels": {
      "component": "kube-apiserver",
      "tier": "control-plane"
    }
  },
  "spec": {
    "volumes": [
      {
        "name": "k8s",
        "hostPath": {
          "path": "/etc/kubernetes"
        }
      },
      {
        "name": "certs",
        "hostPath": {
          "path": "/etc/ssl/certs"
        }
      },
      {
        "name": "pki",
        "hostPath": {
          "path": "/etc/pki"
        }
      }
    ],
    "containers": [
      {
        "name": "kube-apiserver",
        "image": "gcr.io/google_containers/kube-apiserver-amd64:v1.5.3",
        "command": [
          "kube-apiserver",
          "--insecure-bind-address=127.0.0.1",
          "--admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,ResourceQuota",
          "--service-cluster-ip-range=10.96.0.0/12",
          "--service-node-port-range=8880-8880",
          "--service-account-key-file=/etc/kubernetes/pki/apiserver-key.pem",
          "--client-ca-file=/etc/kubernetes/pki/ca.pem",
          "--tls-cert-file=/etc/kubernetes/pki/apiserver.pem",
          "--tls-private-key-file=/etc/kubernetes/pki/apiserver-key.pem",
          "--token-auth-file=/etc/kubernetes/pki/tokens.csv",
          "--secure-port=6443",
          "--allow-privileged",
          "--advertise-address=100.112.226.5",
          "--kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname",
          "--anonymous-auth=false",
          "--etcd-servers=http://127.0.0.1:2379"
        ],
        "resources": {
          "requests": {
            "cpu": "250m"
          }
        },
        "volumeMounts": [
          {
            "name": "k8s",
            "readOnly": true,
            "mountPath": "/etc/kubernetes/"
          },
          {
            "name": "certs",
            "mountPath": "/etc/ssl/certs"
          },
          {
            "name": "pki",
            "mountPath": "/etc/pki"
          }
        ],
        "livenessProbe": {
          "httpGet": {
            "path": "/healthz",
            "port": 8080,
            "host": "127.0.0.1"
          },
          "initialDelaySeconds": 15,
          "timeoutSeconds": 15,
          "failureThreshold": 8
        }
      }
    ],
    "hostNetwork": true
  },
  "status": {}

$ :wq

Ниже приводится усеченный ответ.

# pods "kube-apiserver-test2-highr" was not valid:
# * spec: Forbidden: pod updates may not change fields other than `containers[*].image` or `spec.activeDeadlineSeconds`

Поэтому я попробовал другой подход, отредактировал файл развертывания для kube-apiserver с тем же изменением, что описано выше, и выполнил следующее:

$ kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.json --namespace=kube-system

И получил такой ответ:

The connection to the server localhost:8080 was refused - did you specify the right host or port?

Итак, теперь я застрял, как я могу изменить диапазон допустимых портов?


person Avi Farada    schedule 24.02.2017    source источник


Ответы (3)


Вы неправильно указываете --service-node-port-range=8880-8880. Вы устанавливаете его только на один порт, устанавливаете его на диапазон.

Вторая проблема: вы настраиваете службу на использование 9090, а он не входит в диапазон.

 ports:
  - port: 80
    targetPort: 9090
    nodePort: 9090

Сервер API также должен иметь развертывание. Попробуйте отредактировать диапазон портов в самом развертывании и удалите модуль сервера API, чтобы он был воссоздан с помощью новой конфигурации.

person Farhad Farahi    schedule 24.02.2017
comment
Спасибо за ваш комментарий, я попытался изменить диапазон на --service-node-port-range=8880-8881, и результат был таким же. Дело в том, что с портами просто плохой копипаст, я отредактировал свой пост. - person Avi Farada; 24.02.2017
comment
Пожалуйста, kubectl delete -f и создайте заново, используя новый файл конфигурации. - person Farhad Farahi; 24.02.2017
comment
Я попытался запустить kubectl delete -f /etc/kubernetes/manifests/kube-apiserver.json, как вы предложили, но получил эту ошибку The connection to the server localhost:8080 was refused - did you specify the right host or port? - person Avi Farada; 25.02.2017

Диапазон портов сервисного узла не зря установлен на редко используемые порты. Почему вы хотите публиковать это на каждом узле? Вы действительно этого хотите?

Альтернативой является выставление его на полуслучайном nodeport, а затем использование прокси-модуля на известном узле или наборе узлов для доступа к нему через hostport.

person Tim Hockin    schedule 24.02.2017
comment
Я понимаю причины выбора диапазона портов по умолчанию и согласен с ними, мой выбор портов не соответствует ограничениям на узле, с которым я экспериментирую. Я не полностью понял ваш альтернативный подход к этому, похоже, что вы предлагаете предоставить мои кластерные службы через прокси-сервер, управляемый на узле за пределами кубернетов, или как модуль внутри кубернетов, который сопоставлен с портом хоста, я бы ожидал, что служба будет правильным способом предоставить модули и параметр NodePort для поддержки переадресации портов с помощью хоста, если LoadBalancer недоступен. - person Avi Farada; 25.02.2017
comment
Если у вас один узел и вы экспериментируете, вы можете просто использовать hostPort пода без службы. Все намного проще. Если вы хотите сделать это по-настоящему, мы должны поговорить о конкретной ситуации, чтобы я мог лучше понять. Мое альтернативное предложение действительно демо, а не продакшн. Я знаю, что ограничения NodePort неудобны в некоторых ситуациях, и я очень готов к уточнению, но мне нужно понимать вариант использования. - person Tim Hockin; 26.02.2017

Эта проблема:

The connection to the server localhost:8080 was refused - did you specify the right host or port?

был вызван диапазоном портов, за исключением 8080, на котором работал kube-apiserver, поэтому я не мог отправлять какие-либо обновления в kubectl.

Я исправил это, изменив диапазон портов на 8080-8881 и перезапустив службу kubelet следующим образом:

$ service kubelet restart

Теперь все работает как положено.

person Avi Farada    schedule 25.02.2017