Bagaimana cara memulai layanan kubernetes di NodePort di luar rentang default rentang layanan-node-port?

Saya telah mencoba memulai kubernetes-dashboard (dan akhirnya layanan lainnya) pada NodePort di luar rentang port default dengan sedikit keberhasilan, berikut pengaturan saya: Penyedia cloud: Azure (Bukan layanan kontainer biru) OS: CentOS 7

inilah yang telah saya coba:

Perbarui tuan rumah

$ yum update

Instal 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

Mulai klaster dengan kubeadm

$ kubeadm init

Izinkan menjalankan container pada node utama, karena kami memiliki cluster node tunggal

$ kubectl taint nodes --all dedicated-

Instal jaringan pod

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

Penerapan kubernetes-dashboard kami (@ ~/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

Buat Penerapan kami

$ 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

Saya menemukan bahwa untuk mengubah rentang port yang valid, saya dapat mengatur opsi service-node-port-range di kube-apiserver untuk mengizinkan rentang port yang berbeda, jadi saya mencoba ini:

$ 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

Tambahkan "--service-node-port-range=8880-8880" ke 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

Berikut ini adalah respons terpotong

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

Jadi saya mencoba pendekatan yang berbeda, saya mengedit file penerapan untuk kube-apiserver dengan perubahan yang sama seperti yang dijelaskan di atas dan menjalankan perintah berikut:

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

Dan mendapat tanggapan ini:

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

Jadi sekarang saya buntu, bagaimana cara mengubah rentang port yang valid?


person Avi Farada    schedule 24.02.2017    source sumber


Jawaban (3)


Anda salah menentukan --service-node-port-range=8880-8880. Anda mengaturnya ke satu port saja, Setel ke suatu rentang.

Masalah kedua: Anda menyetel layanan untuk menggunakan 9090 dan itu tidak berada dalam jangkauan.

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

Server API juga harus memiliki penerapan, Coba edit rentang port dalam penerapan itu sendiri dan hapus pod server api sehingga dibuat ulang melalui konfigurasi baru.

person Farhad Farahi    schedule 24.02.2017
comment
Terima kasih atas komentar Anda, saya mencoba mengubah rentang menjadi --service-node-port-range=8880-8881 dan hasilnya sama. Masalah port hanyalah copy-paste yang buruk, saya mengedit posting saya. - person Avi Farada; 24.02.2017
comment
Silakan kubectl delete -f dan buat ulang menggunakan file konfigurasi baru. - person Farhad Farahi; 24.02.2017
comment
Saya mencoba menjalankan kubectl delete -f /etc/kubernetes/manifests/kube-apiserver.json seperti yang Anda sarankan, tetapi mendapat kesalahan ini The connection to the server localhost:8080 was refused - did you specify the right host or port? - person Avi Farada; 25.02.2017

Rentang port simpul Layanan diatur ke port yang jarang digunakan karena suatu alasan. Mengapa Anda ingin mempublikasikan ini di setiap node? Apakah Anda benar-benar ingin itu?

Alternatifnya adalah dengan mengeksposnya pada nodeport semi-acak, lalu menggunakan pod proxy pada node atau kumpulan node yang dikenal untuk mengaksesnya melalui hostport.

person Tim Hockin    schedule 24.02.2017
comment
Saya memahami alasan di balik rentang port default dan menyetujuinya, pilihan port saya sesuai dengan batasan pada node yang saya uji. Saya tidak sepenuhnya memahami pendekatan alternatif Anda terhadap hal ini, sepertinya Anda menyarankan untuk mengekspos layanan cluster saya melalui proxy yang dikelola pada node di luar kubernetes atau sebagai pod di dalam kubernetes yang dipetakan ke port host, saya mengharapkan layanan akan menjadi cara yang tepat untuk mengekspos pod dan opsi NodePort untuk mendukung penerusan port dengan host jika LoadBalancer tidak tersedia. - person Avi Farada; 25.02.2017
comment
Jika Anda memiliki satu node, dan Anda sedang bereksperimen, Anda cukup menggunakan pod hostPort, tanpa layanan. Ini jauh lebih sederhana. Jika Anda benar-benar ingin melakukan ini, kita harus membicarakan situasi sebenarnya sehingga saya dapat memahaminya dengan lebih baik. Proposal alt saya benar-benar tingkat demo, bukan prod. Saya tahu batasan NodePort terasa janggal dalam beberapa situasi dan saya sangat terbuka untuk perbaikan, namun saya perlu memahami kasus penggunaannya. - person Tim Hockin; 26.02.2017

Masalah ini:

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

disebabkan oleh rentang port saya kecuali 8080, yang digunakan oleh kube-apiserver, jadi saya tidak dapat mengirim pembaruan apa pun ke kubectl.

Saya memperbaikinya dengan mengubah rentang port ke 8080-8881 dan memulai ulang layanan kubelet seperti ini:

$ service kubelet restart

Semuanya berfungsi seperti yang diharapkan sekarang.

person Avi Farada    schedule 25.02.2017