Kubernetes для бедных. Настраиваем доступ по HTTP
Мы собрали кластер Kubernetes и установили менеджер пакетов Helm.
Теперь установим и настроим контроллер входящего трафика HTTP и менеджер сертификатов с поддержкой Let's Encrypt.
Ingress controller
Поскольку решение бюджетное, изображать отказоустойчивость будет обычный DNS RR на два адреса. Трафик будем принимать в обход сервиса прямо на контейнеры контроллера, запущенные с неизолированной сетью, т.е. het=host, чтобы контроллер видел реальные адреса клиентов. Если использовать сервис, трафик будет попадать в контейнеры после NAT и в логах вместо клиентских окажутся внутренние адреса узлов. Перед установкой контроллера пометим два рабочих узла кластера, например так:
kubectl label node node1 remizov.org/ingress=true kubectl label node node2 remizov.org/ingress=true
Названия и значения меток могут быть любыми допустимыми, главное - упомянуть те же самые в nodeSelector в переменных установки.
Теперь установим Ingress controller на базе nginx при помощи helm:
cat <<EOF > values.yml controller: replicaCount: 2 hostNetwork: true nodeSelector: remizov.org/ingress: "true" service: type: ClusterIP rbac: create: true EOF helm install --namespace kube-system -n ingress stable/nginx-ingress -f values.yml
Убедимся, что контроллеры встали на те узлы, на которые нужно, и привязаны к внешним адресам:
$ kubectl -n kube-system get po -o wide -l app=nginx-ingress,component=controller NAME READY STATUS RESTARTS AGE IP NODE ingress-nginx-ingress-controller-76b496fcb6-2tbls 1/1 Running 0 2m 195.201.22.121 node1 ingress-nginx-ingress-controller-76b496fcb6-dv42r 1/1 Running 0 2m 195.201.22.122 node2
Менеджер сертификатов
Менеджер сертификатов устанавливается так же при помощи helm:
helm install --namespace kube-system -n cert-manager stable/cert-manager
Создадим два центра сертификации: letsencrypt-staging для тестов и letsencrypt-v01 - для боя:
$ cat <<EOF | kubectl create -f - --- apiVersion: certmanager.k8s.io/v1alpha1 kind: ClusterIssuer metadata: name: letsencrypt-staging spec: acme: email: user@example.com http01: {} privateKeySecretRef: name: letsencrypt-staging server: https://acme-staging.api.letsencrypt.org/directory --- apiVersion: certmanager.k8s.io/v1alpha1 kind: ClusterIssuer metadata: name: letsencrypt-v01 spec: acme: email: user@example.com http01: {} privateKeySecretRef: name: letsencrypt-v01 server: https://acme-v01.api.letsencrypt.org/directory EOF clusterissuer "letsencrypt-staging" created clusterissuer "letsencrypt-v01" created
Проверка HTTPS
С этого этапа понадобится доступ к публичной зоне DNS, чтобы Let's Encrypt смогли достучаться до нашего кластера и проверить запрос на сертификат. Пусть это зона example.org. Заведём запись www2.example.org. A 195.201.22.121, так, чтобы запросы попадали на контроллер ingress. После того, как запись станет выдаваться на запросы DNS, создадим правило ingress:
$ cat <<EOF | kubectl create -f - apiVersion: extensions/v1beta1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: nginx certmanager.k8s.io/cluster-issuer: letsencrypt-staging name: www2-example-org spec: rules: - host: www2.example.org http: paths: - backend: serviceName: ingress-nginx-ingress-default-backend servicePort: 80 path: / tls: - hosts: - www2.example.org secretName: www2-example-org-tls EOF
Центр сертификации определяется аннотацией certmanager.k8s.io/cluster-issuer. Сейчас выберем тестовый. Имя для сертификата выбирается из секции tls:. Если всё прошло нормально, при запросе к https://www2.example.org будет отдаваться недействительный сертификат, выписанный центром Fake LE Intermediate X1:
$ curl -kv https://www2.example.org * Hostname was NOT found in DNS cache * Trying 195.201.22.121... * Connected to www2.example.org (195.201.22.121) port 443 (#0) . . . * Server certificate: * subject: CN=www2.example.org * start date: 2018-05-04 19:16:17 GMT * expire date: 2018-08-02 19:16:17 GMT * issuer: CN=Fake LE Intermediate X1 * SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway. * SSLv2, Unknown (23): . . .
Теперь всё готово для того, чтобы разместить в кластере реальный веб-сервис.