Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

README.md

Домашнее задание к занятию "12.1 Компоненты Kubernetes"

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

Задача 1: Установить Minikube

Для экспериментов и валидации ваших решений вам нужно подготовить тестовую среду для работы с Kubernetes. Оптимальное решение — развернуть на рабочей машине Minikube.

Как поставить на AWS:

  • создать EC2 виртуальную машину (Ubuntu Server 20.04 LTS (HVM), SSD Volume Type) с типом t3.small. Для работы потребуется настроить Security Group для доступа по ssh. Не забудьте указать keypair, он потребуется для подключения.
  • подключитесь к серверу по ssh (ssh ubuntu@<ipv4_public_ip> -i .pem)
  • установите миникуб и докер следующими командами:
  • проверить версию можно командой minikube version
  • переключаемся на root и запускаем миникуб: minikube start --vm-driver=none
  • после запуска стоит проверить статус: minikube status
  • запущенные служебные компоненты можно увидеть командой: kubectl get pods --namespace=kube-system

Для сброса кластера стоит удалить кластер и создать заново:

  • minikube delete
  • minikube start --vm-driver=none

Возможно, для повторного запуска потребуется выполнить команду: sudo sysctl fs.protected_regular=0

Инструкция по установке Minikube - ссылка

Важно: t3.small не входит во free tier, следите за бюджетом аккаунта и удаляйте виртуалку.

Задача 2: Запуск Hello World

После установки Minikube требуется его проверить. Для этого подойдет стандартное приложение hello world. А для доступа к нему потребуется ingress.

  • развернуть через Minikube тестовое приложение по туториалу
  • установить аддоны ingress и dashboard

Задача 3: Установить kubectl

Подготовить рабочую машину для управления корпоративным кластером. Установить клиентское приложение kubectl.

  • подключиться к minikube
  • проверить работу приложения из задания 2, запустив port-forward до кластера

Задача 4 (*): собрать через ansible (необязательное)

Профессионалы не делают одну и ту же задачу два раза. Давайте закрепим полученные навыки, автоматизировав выполнение заданий ansible-скриптами. При выполнении задания обратите внимание на доступные модули для k8s под ansible.

  • собрать роль для установки minikube на aws сервисе (с установкой ingress)
  • собрать роль для запуска в кластере hello world

Ответы:

Задача 1: Установить Minikube

Установка minikube:

vagrant@server3:~$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
vagrant@server3:~$ sudo install minikube-linux-amd64 /usr/local/bin/minikube
vagrant@server3:~$  minikube version
minikube version: v1.28.0

Пропсиываем ресурсы для minikube:
```sh
vagrant@server3:~$ cat .minikube/config/config.json
{
    "cpus": 2,
    "driver": "docker",
    "memory": "2200"
}

Запускаем:

vagrant@server3:~/REPO$ minikube start
vagrant@server3:~/REPO$ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

Внутренний кластерный адрес 192.168.49.2, внешний none:

vagrant@server3:~$ kubectl get nodes -o wide
NAME       STATUS   ROLES           AGE     VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
minikube   Ready    control-plane   5d23h   v1.25.3   192.168.49.2   <none>        Ubuntu 20.04.5 LTS   5.15.0-30-generic   docker://20.10.20

Задача 2: Запуск Hello World

vagrant@server3:~$ minikube addons enable dashboard metrics-server ingress
vagrant@server3:~/REPO$ minikube addons list
|-----------------------------|----------|--------------|--------------------------------|
|         ADDON NAME          | PROFILE  |    STATUS    |           MAINTAINER           |
|-----------------------------|----------|--------------|--------------------------------|
| ambassador                  | minikube | disabled     | 3rd party (Ambassador)         |
| auto-pause                  | minikube | disabled     | Google                         |
| cloud-spanner               | minikube | disabled     | Google                         |
| csi-hostpath-driver         | minikube | disabled     | Kubernetes                     |
| dashboard                   | minikube | enabled ✅   | Kubernetes                     |
| default-storageclass        | minikube | enabled ✅   | Kubernetes                     |
| efk                         | minikube | disabled     | 3rd party (Elastic)            |
| freshpod                    | minikube | disabled     | Google                         |
| gcp-auth                    | minikube | disabled     | Google                         |
| gvisor                      | minikube | disabled     | Google                         |
| headlamp                    | minikube | disabled     | 3rd party (kinvolk.io)         |
| helm-tiller                 | minikube | disabled     | 3rd party (Helm)               |
| inaccel                     | minikube | disabled     | 3rd party (InAccel             |
|                             |          |              | [info@inaccel.com])            |
| ingress                     | minikube | enabled ✅   | Kubernetes                     |
| ingress-dns                 | minikube | disabled     | Google                         |
| istio                       | minikube | disabled     | 3rd party (Istio)              |
| istio-provisioner           | minikube | disabled     | 3rd party (Istio)              |
| kong                        | minikube | disabled     | 3rd party (Kong HQ)            |
| kubevirt                    | minikube | disabled     | 3rd party (KubeVirt)           |
| logviewer                   | minikube | disabled     | 3rd party (unknown)            |
| metallb                     | minikube | disabled     | 3rd party (MetalLB)            |
| metrics-server              | minikube | enabled ✅   | Kubernetes                     |
| nvidia-driver-installer     | minikube | disabled     | Google                         |
| nvidia-gpu-device-plugin    | minikube | disabled     | 3rd party (Nvidia)             |
| olm                         | minikube | disabled     | 3rd party (Operator Framework) |
| pod-security-policy         | minikube | disabled     | 3rd party (unknown)            |
| portainer                   | minikube | disabled     | 3rd party (Portainer.io)       |
| registry                    | minikube | disabled     | Google                         |
| registry-aliases            | minikube | disabled     | 3rd party (unknown)            |
| registry-creds              | minikube | disabled     | 3rd party (UPMC Enterprises)   |
| storage-provisioner         | minikube | enabled ✅   | Google                         |
| storage-provisioner-gluster | minikube | disabled     | 3rd party (Gluster)            |
| volumesnapshots             | minikube | disabled     | Kubernetes                     |
|-----------------------------|----------|--------------|--------------------------------|

vagrant@server3:~/REPO$ kubectl get pods --namespace=kubernetes-dashboard
NAME                                        READY   STATUS    RESTARTS   AGE
dashboard-metrics-scraper-b74747df5-lwkfm   1/1     Running   0          12h
kubernetes-dashboard-57bbdc5f89-56z4w       1/1     Running   0          12h

vagrant@server3:~/REPO$ kubectl proxy --address 0.0.0.0 kubernetes-dashboard-57bbdc5f89-56z4w  8001:80 --namespace=kubernetes-dashboard --disable-filter=true

vagrant@server3:~/REPO$ kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority: /home/vagrant/.minikube/ca.crt
    extensions:
    - extension:
        last-update: Thu, 17 Nov 2022 04:44:45 UTC
        provider: minikube.sigs.k8s.io
        version: v1.28.0
      name: cluster_info
    server: https://192.168.49.2:8443
  name: minikube
contexts:
- context:
    cluster: minikube
    extensions:
    - extension:
        last-update: Thu, 17 Nov 2022 04:44:45 UTC
        provider: minikube.sigs.k8s.io
        version: v1.28.0
      name: context_info
    namespace: default
    user: minikube
  name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
  user:
    client-certificate: /home/vagrant/.minikube/profiles/minikube/client.crt
    client-key: /home/vagrant/.minikube/profiles/minikube/client.key

Скриншот дашборда

vagrant@server3:~/REPO$ kubectl create deployment hello-node --image=k8s.gcr.io/echoserver:1.4
deployment.apps/hello-node created

vagrant@server3:~/REPO$ kubectl get deployments
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
hello-node   1/1     1            1           2m35s

vagrant@server3:~/REPO$ kubectl get pods
NAME                         READY   STATUS    RESTARTS      AGE
hello-node-697897c86-tmzw9   1/1     Running   0             2m38s

vagrant@server3:~/REPO$ kubectl get events
LAST SEEN   TYPE     REASON              OBJECT                            MESSAGE
4m1s        Normal   Scheduled           pod/hello-node-697897c86-tmzw9    Successfully assigned default/hello-node-697897c86-tmzw9 to minikube
4m          Normal   Pulling             pod/hello-node-697897c86-tmzw9    Pulling image "k8s.gcr.io/echoserver:1.4"
2m16s       Normal   Pulled              pod/hello-node-697897c86-tmzw9    Successfully pulled image "k8s.gcr.io/echoserver:1.4" in 1m44.50749297s
2m14s       Normal   Created             pod/hello-node-697897c86-tmzw9    Created container echoserver
2m13s       Normal   Started             pod/hello-node-697897c86-tmzw9    Started container echoserver
4m2s        Normal   SuccessfulCreate    replicaset/hello-node-697897c86   Created pod: hello-node-697897c86-tmzw9
4m2s        Normal   ScalingReplicaSet   deployment/hello-node             Scaled up replica set hello-node-697897c86 to 1

Задача 3: Установить kubectl

Установка kubectl:

vagrant@server3:~$ curl -LO "https://dl.k8s.io/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256"
vagrant@server3:~$ sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
vagrant@server3:~$  kubectl version --client --output=yaml
clientVersion:
  buildDate: "2022-10-12T10:57:26Z"
  compiler: gc
  gitCommit: 434bfd82814af038ad94d62ebe59b133fcb50506
  gitTreeState: clean
  gitVersion: v1.25.3
  goVersion: go1.19.2
  major: "1"
  minor: "25"
  platform: linux/amd64
kustomizeVersion: v4.5.7

Сделаем под hello-node доступным за пределами кластера. Запустим сервис.

vagrant@server3:~/REPO$ kubectl expose deployment hello-node --type=LoadBalancer --port=8080
service/hello-node exposed

vagrant@server3:~/REPO$ kubectl get services
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
hello-node   LoadBalancer   10.106.123.65   <pending>     8080:31159/TCP   11s
kubernetes   ClusterIP      10.96.0.1       <none>        443/TCP          45h

vagrant@server3:~/REPO$ minikube service hello-node
|-----------|------------|-------------|---------------------------|
| NAMESPACE |    NAME    | TARGET PORT |            URL            |
|-----------|------------|-------------|---------------------------|
| default   | hello-node |        8080 | http://192.168.49.2:31159 |
|-----------|------------|-------------|---------------------------|
* Opening service default/hello-node in default browser...
  http://192.168.49.2:31159

Проверяем с помощью curl:

vagrant@server3:~/REPO$ curl http://192.168.49.2:31159/
CLIENT VALUES:
client_address=172.17.0.1
command=GET
real path=/
query=nil
request_version=1.1
request_uri=http://192.168.49.2:8080/

SERVER VALUES:
server_version=nginx: 1.10.0 - lua: 10001

HEADERS RECEIVED:
accept=*/*
host=192.168.49.2:31159
user-agent=curl/7.81.0
BODY:
-no body in request-

Вариант со сборкой своего Docker образа "Hello World", собираем образ по туториалу k8s (ссылка выше). Исходники в директории Dockerfile и server.js.
Cоздаем переменные окружения Docker для Minikube с помощью команды minikube docker-env.

vagrant@server3:~$ eval $(minikube docker-env)

vagrant@server3:~$ docker build -t hello-k8s:1.0.0 .
vagrant@server3:~/REPO/devops-netology/homeworks/12-kubernetes-01-intro/hello-k8s$ docker image ls
REPOSITORY                                      TAG       IMAGE ID       CREATED         SIZE
hello-k8s                                       1.0.0     a0cf79a363fa   12 hours ago    660MB

vagrant@server3:~/REPO/devops-netology/homeworks/12-kubernetes-01-intro/hello-k8s$ kubectl create deployment hello-k8s --image=hello-k8s:1.0.0 --port=8080
deployment.apps/hello-k8s created

vagrant@server3:~/REPO/devops-netology/homeworks/12-kubernetes-01-intro/hello-k8s$ kubectl expose deployment hello-k8s --type=NodePort
service/hello-k8s exposed

vagrant@server3:~/REPO/devops-netology/homeworks/12-kubernetes-01-intro/hello-k8s$ kubectl get service
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
hello-k8s    NodePort    10.107.38.239   <none>        8080:31126/TCP   21s

vagrant@server3:~/REPO/devops-netology/homeworks/12-kubernetes-01-intro/hello-k8s$ minikube service hello-k8s
|-----------|-----------|-------------|---------------------------|
| NAMESPACE |   NAME    | TARGET PORT |            URL            |
|-----------|-----------|-------------|---------------------------|
| default   | hello-k8s |        8080 | http://192.168.49.2:31126 |
|-----------|-----------|-------------|---------------------------|
* Opening service default/hello-k8s in default browser...
  http://192.168.49.2:31126

Проверяем с помощью curl:

vagrant@server3:~/REPO/devops-netology/homeworks/12-kubernetes-01-intro/hello-k8s$ curl http://192.168.49.2:31126
Hello k8s Beginners!