Как настроить Kubernetes в режиме шпильки - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь включить шпильки в моей службе Kubernetes в GKE.

Я пытался следовать приведенным здесь инструкциям: https://kubernetes.io/docs/tasks/administer-cluster/reconfigure-kubelet/, чтобы настроить мой конфигурационный файл kubelet на включите режим шпильки, но похоже, что мои конфиги никогда не сохраняются, хотя команда редактирования возвращается без ошибки.

Вот что я пытаюсь установить при редактировании узла:

spec:
  podCIDR: 10.4.1.0/24
  providerID: gce://staging/us-east4-b/gke-cluster-staging-highmem-f36fb529-cfnv
  configSource:
    configMap:
      name: my-node-config-4kbd7d944d
      namespace: kube-system
      kubeletConfigKey: kubelet

Вот моя конфигурация узла, когда я ее описываю

Name:         my-node-config-4kbd7d944d
Namespace:    kube-system
Labels:       <none>
Annotations:  <none>

Data
====
kubelet_config:
----
{
  "kind": "KubeletConfiguration",
  "apiVersion": "kubelet.config.k8s.io/v1beta1",
  "hairpinMode": "hairpin-veth"
}

Я пробовал использовать "edit node" и "patch". Тот же результат в том, что ничего не сохраняется. Patch возвращает «никаких изменений не сделано».

Вот команда исправления из учебника:

kubectl patch node ${NODE_NAME} -p "{\"spec\":{\"configSource\":{\"configMap\":{\"name\":\"${CONFIG_MAP_NAME}\",\"namespace\":\"kube-system\",\"kubeletConfigKey\":\"kubelet\"}}}}"

Я также не могу найти какой-либо ресурс, в котором атрибут «hairpinMode» должен быть установленным

Любая помощь приветствуется!

------------------- edit ------------- ---

вот почему я думаю, что закрепление не работает.

root@668cb9686f-dzcx8:/app# nslookup tasks-staging.[my-domain].com
Server:     10.0.32.10
Address:    10.0.32.10#53

Non-authoritative answer:
Name:   tasks-staging.[my-domain].com
Address: 34.102.170.43

root@668cb9686f-dzcx8:/app# curl https://[my-domain].com/python/healthz
hello
root@668cb9686f-dzcx8:/app# nslookup my-service.default
Server:     10.0.32.10
Address:    10.0.32.10#53

Name:   my-service.default.svc.cluster.local
Address: 10.0.38.76

root@668cb9686f-dzcx8:/app# curl https://my-service.default.svc.cluster.local/python/healthz
curl: (7) Failed to connect to my-service.default.svc.cluster.local port 443: Connection timed out

также, если я отправляю запрос на localhost из моего сервиса (не curl), он получает "соединение" отказалась." Впрочем, отправка запросов на внешний домен, который должен перенаправляться на один и тот же модуль.

В данный момент у меня есть только одна служба, один узел, один модуль и два порта прослушивания.

------------------ --- включая развертывание yaml ----------------- Развертывание

spec:
  replicas: 1
    spec:
      containers:
      - name: my-app
        ports:
        - containerPort: 8080
        - containerPort: 50001
        readinessProbe:
          httpGet:
            path: /healthz
            port: 8080
            scheme: HTTPS

Вход:

apiVersion: extensions/v1beta1
kind: Ingress
spec:
  backend:
    serviceName: my-service
    servicePort: 60000
  rules:
  - http:
      paths:
      - path: /*
        backend:
          serviceName: my-service
          servicePort: 60000
      - path: /python/*
        backend:
          serviceName: my-service
          servicePort: 60001

service

---
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  ports:
  - name: port
    port: 60000
    targetPort: 8080
  - name: python-port
    port: 60001
    targetPort: 50001
  type: NodePort

Я пытаюсь настроить многопортовое приложение, в котором основная программа запускает сценарий для запуска, выполняя запрос на локальном компьютере через другой порт. (Мне нужно запустить что-то в python, но основное приложение в golang.)

Это простой скрипт, и я бы хотел избежать выставления конечных точек python с внешним доменом, поэтому Мне не нужно беспокоиться об аутентификации и т. Д. c.

-------------- запросы, отправленные my-service в golang -------------

https://[my-domain]/health: success
https://[my-domain]/python/healthz: success
http://my-service.default:60000/healthz: dial tcp: lookup my-service.default on 169.254.169.254:53: no such host 
http://my-service.default/python/healthz: dial tcp: lookup my-service.default on 169.254.169.254:53: no such host 
http://my-service.default:60001/python/healthz: dial tcp: lookup my-service.default on 169.254.169.254:53: no such host 
http://localhost:50001/healthz: dial tcp 127.0.0.1:50001: connect: connection refused 
http://localhost:50001/python/healthz: dial tcp 127.0.0.1:50001: connect: connection refused 

1 Ответ

0 голосов
/ 02 апреля 2020

реконфигурация Kubelet в GKE


Не следует реконфигурировать kubelet в управляемых облаком кластерах Kubernetes, таких как GKE. Это не поддерживается, и это может привести к ошибкам и сбоям.

Hairpinning в GKE


Hairpinning включено по умолчанию в предоставленных кластерах GKE , Вы можете проверить, включена ли она, вызвав следующую команду на одном из GKE узлов:

ifconfig cbr0 |grep PROMISC

Вывод должен выглядеть так:

UP BROADCAST RUNNING PROMISC MULTICAST MTU:1460 Metric:1

Где PROMISC будет означать, что подключение включено через сервис ip

Рабочая нагрузка


На основании только предоставленного вами определения сервиса у вас должен быть доступ к вашему приложению python через порт 50001 с модулем хостинг с:

  • localhost: 50001
  • ClusterIP: 60001
  • my-service: 60001
  • NodeIP: nodeport-port (проверьте $ kubectl get svc my-service для этого порта)

Я попытался запустить ваш ресурс Ingress, но он не смог создать. Пожалуйста, проверьте, как должно выглядеть определение Ingress.

Пожалуйста, ознакомьтесь с официальной документацией, где весь процесс развертывания объясняется с примерами:

Дополнительно пожалуйста, проверьте другие ответы StackOverflow, такие как:

Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы к этому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...