Kubernetes — это механизм оркестрации контейнеров с открытым исходным кодом от Goole, который поддерживает автоматическое развертывание, крупномасштабную масштабируемость и контейнерное управление приложениями — энциклопедия Baidu.
Я контактирую с K8s более полугода, и на основе платформы Alibaba Cloud я также построил кластер K8s, который включает в себя многоуровневые сервисы и в настоящее время работает относительно стабильно (для заинтересованных, пожалуйста, обратитесь кСмешанный режим облачного кластера k8s может помочь вам сэкономить более 50 % затрат на обслуживание.,Совместное использование режима мэшапа облачного кластера K8s), но у меня не было времени систематически его изучать. Эта серия статей записывается и публикуется в виде заметок, как и предыдущая серия Docker. Она будет включать теорию и практику. Заинтересованные студенты могут обратить внимание и изучить вместе. решения для контейнеризации и оркестрации сервисов.
Если вы хотите делать свою работу хорошо, вы должны сначала отточить свои инструменты.В этой статье сначала рассказывается, как создать кластер k8s локально, и мы используем Ansible, который мы представили ранее, для повышения эффективности (см.Краткое руководство по Ansible)
Все файлы конфигурации, описанные в этой статье, можно найти здесь.github
1. Подготовьте узел сервера
Если у вас еще нет сервера, вы можете обратиться кСверхполный процесс создания среды виртуальной машины KVM на Ubuntu 18.04.Создайте виртуальный сервер.
IP узла сервера (имя хоста):
- 192.168.40.111 (kmaster)
- 192.168.40.112 (knode1)
- 192.168.40.113 (knode2)
- 192.168.40.114 (knode3)
Версия ОС:
-
cat /etc/redhat-release
: CentOS Linux release 7.6.1810 (Core) -
uname -a
: 3.10.0-957.el7.x86_64
2. Настройте Ansible
Если у вас нет среды Ansible, вы можете обратиться к [Ansible Concise Tutorial].Tickets.WeChat.QQ.com/Yes/J i Z E1RV N7…) строить.
1. Добавьте информацию об узле сервера k8s в файл /etc/hosts на сервере Ansible (см.hosts)
192.168.40.111 kmaster
192.168.40.112 knode1
192.168.40.113 knode2
192.168.40.114 knode3
2. Добавьте узел сервера k8s в файл /etc/ansible/hosts на сервере Ansible (см.ansible_hosts)
[k8s-all]
kmaster
knode1
knode2
knode3
[k8s-master]
kmaster
[k8s-nodes]
knode1
knode2
knode3
3. Измените /etc/hosts каждого узла кластера k8s (не обязательно)
Измените все файлы хоста /etc/hosts и добавьте сопоставление IP/имени хоста, чтобы облегчить доступ через имя хоста ssh.
1. Создайте файл playbook (ссылкаset_hosts_playbook.yml)
vim set_hosts_playbook.yml
---
- hosts: k8s-all
remote_user: root
tasks:
- name: backup /etc/hosts
shell: mv /etc/hosts /etc/hosts_bak
- name: copy local hosts file to remote
copy: src=/etc/hosts dest=/etc/ owner=root group=root mode=0644
2. Выполнить ansible-playbook
ansible-playbook set_hosts_playbook.yml
4. Установите Докер
Установите Docker на все хосты
1. Создайте файл playbook (ссылкаinstall_docker_playbook.yml)
vim install_docker_playbook.yml
- hosts: k8s-all
remote_user: root
vars:
docker_version: 18.09.2
tasks:
- name: install dependencies
#shell: yum install -y yum-utils device-mapper-persistent-data lvm2
yum: name={{item}} state=present
with_items:
- yum-utils
- device-mapper-persistent-data
- lvm2
- name: config yum repo
shell: yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
- name: install docker
yum: name=docker-ce-{{docker_version}} state=present
- name: start docker
shell: systemctl enable docker && systemctl start docker
2. Выполнить ansible-playbook
ansible-playbook install_docker_playbook.yml
5. Разверните мастер k8s
1. Перед началом развёртывания нужно сделать некоторую обработку инициализации: выключить брандмауэр, выключить selinux, отключить своп, настроить источник k8s Alibaba cloud yum и т.д. Все операции помещаются в скриптpre-setup.sh, и выполнить его через модуль скрипта во 2 playbook
2. Создайте файл playbookdeploy_master_playbook.yml, только для главного узла установите kubectl, kubeadm, kubelet и flannel (измените quay.io адреса зеркала в файле kube-flannel.yml на quay-mirror.qiniu.com, чтобы избежать тайм-аута, см.kube-flannel.yml)
vim deploy_master_playbook.yml
- hosts: k8s-master
remote_user: root:q
vars:
kube_version: 1.16.0-0
k8s_version: v1.16.0
k8s_master: 192.168.40.111
tasks:
- name: prepare env
script: ./pre-setup.sh
- name: install kubectl,kubeadm,kubelet
yum: name={{item}} state=present
with_items:
- kubectl-{{kube_version}}
- kubeadm-{{kube_version}}
- kubelet-{{kube_version}}
- name: init k8s
shell: kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version {{k8s_version}} --apiserver-advertise-address {{k8s_master}} --pod-network-cidr=10.244.0.0/16 --token-ttl 0
- name: config kube
shell: mkdir -p $HOME/.kube && cp -i /etc/kubernetes/admin.conf $HOME/.kube/config && chown $(id -u):$(id -g) $HOME/.kube/config
- name: copy flannel yaml file
copy: src=./kube-flannel.yml dest=/tmp/ owner=root group=root mode=0644
- name: install flannel
shell: kubectl apply -f /tmp/kube-flannel.yml
- name: get join command
shell: kubeadm token create --print-join-command
register: join_command
- name: show join command
debug: var=join_command verbosity=0
3. Выполнить ansible-playbook
ansible-playbook deploy_master_playbook.yml
4. После выполнения вышеуказанной команды будет выведена команда для присоединения узла к кластеру k8s, как показано на следующем рисунке. Запишите эту команду, она будет использоваться при развертывании узла позже
6. Разверните узел k8s
1. Как и мастеру, перед запуском развертывания необходимо выполнить некоторую обработку по инициализации: отключить брандмауэр, отключить selinux, отключить своп, настроить источник k8s Alibaba cloud yum и т.д. Все операции помещаются в скриптpre-setup.sh, и выполнить его через модуль скрипта во 2 playbook
2. Создайте файл playbookdeploy_nodes_playbook.yml, для других узлов кластера, кроме мастера, установите kubeadm, kubelet и добавьте узел в кластер k8s, используя выходные данные команды join cluster, когда мастер был развернут ранее
vim deploy_nodes_playbook.yml
- hosts: k8s-nodes
remote_user: root
vars:
kube_version: 1.16.0-0
tasks:
- name: prepare env
script: ./pre-setup.sh
- name: install kubeadm,kubelet
yum: name={{item}} state=present
with_items:
- kubeadm-{{kube_version}}
- kubelet-{{kube_version}}
- name: start kubelt
shell: systemctl enable kubelet && systemctl start kubelet
- name: join cluster
shell: kubeadm join 192.168.40.111:6443 --token zgx3ov.zlq3jh12atw1zh8r --discovery-token-ca-cert-hash sha256:60b7c62687974ec5803e0b69cfc7ccc2c4a8236e59c8e8b8a67f726358863fa7
3. Выполнить ansible-playbook
ansible-playbook deploy_nodes_playbook.yml
4. Подождите некоторое время, вы можете перейти на мастер-узелkubectl get nodes
Просмотрите узлы, добавленные в кластер, и состояние Готово, как показано ниже.
[root@kmaster ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kmaster Ready master 37m v1.16.0
knode1 Ready <none> 7m1s v1.16.0
knode2 Ready <none> 7m1s v1.16.0
knode3 Ready <none> 4m12s v1.16.0
На этом базовое развертывание кластера k8s завершено. Затем установите Ingress и Dashboard.
7. Установите Ingress
Ingress обеспечивает доступ к внешней сети для сервисов в кластере, включая две версии на базе Nginx и Traefik, здесь используется привычная версия Nginx. Операция установки Ingress выполняется на главном узле (поскольку kubectl установлен и настроен на главном узле, ее также можно выполнить на других узлах, где установлен и настроен kubectl)
1. Загрузите файл yaml (в этом каталоге уже естьnginx-ingress.yaml, и изменил адрес зеркала, вы можете сразу перейти к шагу 3)
wget -O nginx-ingress.yaml https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/baremetal/deploy.yaml
2. Измените quay.io внутри на quay-mirror.qiniu.com, чтобы избежать тайм-аута извлечения зеркала. В то же время добавьте метку hostNetwork как true и nginx-ingress в Deployment of nginx-ingress-controller, чтобы использовать хост-сеть и контролировать узлы, развернутые Ingress.
vim nginx-ingress.yaml
:s/quay.io/quay-mirror.qiniu.com/g
vim nginx-ingress.yaml
spec:
hostNetwork: true
nodeSelector:
nginx-ingress: "true"
3. Разверните Ingress
Во-первых, отметьте nginx-ingress=true на узле knode1, управляйте Ingress, который будет развернут на узле knode1, и оставьте фиксированным IP-адрес.
[root@kmaster k8s-deploy]# kubectl label node knode1 nginx-ingress=true
node/knode1 labeled
Затем завершите развертывание nginx-ingress.
kubectl apply -f nginx-ingress.yaml
4. После завершения развертывания подождите некоторое время и дождитесь создания пода.Вы можете использовать следующую команду для просмотра состояния пода, связанного с входом.
[root@kmaster k8s-deploy]# kubectl get pods -n ingress-nginx -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ingress-nginx-admission-create-drpg5 0/1 Completed 0 79m 10.244.2.2 knode1 <none> <none>
ingress-nginx-admission-patch-db2rt 0/1 Completed 1 79m 10.244.3.2 knode3 <none> <none>
ingress-nginx-controller-575cffb49c-4xm55 1/1 Running 0 79m 192.168.40.112 knode1 <none> <none>
8. Установите панель инструментов Kubernetes
1. Загрузите файл yaml (в этом каталоге уже естьkubernetes-dashboard.yamlфайл, вы можете сразу перейти к шагу 3)
wget -O kubernetes-dashboard.yaml https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta5/aio/deploy/recommended.yaml
2. Измените kubernetes-dashboard.yaml
Измените тип службы на NodePort, чтобы панель управления была доступна по IP. Закомментируйте секрет по умолчанию (разрешение на секрет по умолчанию очень ограничено, вы не можете увидеть много данных)
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort
ports:
- port: 443
targetPort: 8443
nodePort: 30443
selector:
k8s-app: kubernetes-dashboard
3. Разверните Dashboard и создайте ServiceAccount, привязанный к роли администратора кластера — пользователь-администратор (см.auth.yaml)
kubectl apply -f kubernetes-dashboard.yaml
kubectl apply -f kubernetes-dashboard-auth.yaml
4. Посетите панель инструментов
Посетите https://IP любого узла в кластере: 30443, откройте страницу входа в панель управления и выполните следующую команду, чтобы получить токен входа.
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
Используйте токен для завершения входа, как показано на рисунке
9. Решить проблему недействительного сертификата
После установки сертификат по умолчанию может быть недействительным, и панель управления не может быть открыта в браузере Chrome, что можно решить путем повторного создания сертификата.
1. Создайте собственный сертификат
[root@kmaster ~]# cd /etc/kubernetes/pki/
#生成私钥
[root@kmaster pki]# openssl genrsa -out dashboard.key 2048
#生成证书
[root@kmaster pki]# openssl req -new -key dashboard.key -out dashboard.csr -subj "/O=JBST/CN=kubernetes-dashboard"
#使用集群的CA来签署证书
[root@kmaster pki]# openssl x509 -req -in dashboard.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out dashboard.crt -days 3650
#查看自创证书
[root@kmaster pki]# openssl x509 -in dashboard.crt -noout -text
2. Примечанияkubernetes-dashboard.yamlСекрет по умолчанию в ,
#---
#
#apiVersion: v1
#kind: Secret
#metadata:
# labels:
# k8s-app: kubernetes-dashboard
# name: kubernetes-dashboard-certs
# namespace: kubernetes-dashboard
#type: Opaque
3. Повторно разверните панель управления и создайте новый секрет с пользовательским сертификатом.
[root@kmaster k8s-deploy]# kubectl delete -f kubernetes-dashboard.yaml
[root@kmaster k8s-deploy]# kubectl apply -f kubernetes-dashboard.yaml
[root@kmaster k8s-deploy]# kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.crt=/etc/kubernetes/pki/dashboard.crt --from-file=dashboard.key=/etc/kubernetes/pki/dashboard.key -n kubernetes-dashboard
10. Локальное управление кластером k8s (win10)
1. Загрузите версию kubectl для Windows:storage.Google APIs.com/Что особенного-…
2. Добавьте каталог, в котором находится файл kubectl.exe, в путь системной переменной среды.
3. Скопируйте содержимое /etc/kubernetes/admin.conf на главном узле в файл .kube/config в локальном пользовательском каталоге, напримерC:\Users\Administrator\.kube\config
4. Подтвердить
C:\Users\Administrator>kubectl get nodes
NAME STATUS ROLES AGE VERSION
kmaster Ready master 4d19h v1.16.0
knode1 Ready <none> 4d19h v1.16.0
knode2 Ready <none> 4d19h v1.16.0
knode3 Ready <none> 4d19h v1.16.0
Все файлы конфигурации, описанные в этой статье, можно найти здесь.github
Связанное чтение:
- Смешанный режим облачного кластера k8s может помочь вам сэкономить более 50 % затрат на обслуживание.
- Совместное использование режима мэшапа облачного кластера K8s
- Краткое руководство по Ansible
Добро пожаловать на публичный аккаунт автора: техническое пространство пустой горы и нового дождя