Разверните свое первое приложение с помощью k8s: Pod, развертывание и обслуживание

Docker Kubernetes

Тысяча миль начинается с одного шага

Когда мы новичок в изучении языка программирования, мы всегда начинаем сhello, worldНачинать.

Когда мы узнаем, как развертывать приложения на k8s, разверните простойnginx, чтобы получить доступ к его странице конфигурации. Поскольку у него есть все внутренние органы, простые функции и нет состояния, его можно использовать в качестве приложения для развертывания k8s.hello, world.

В этой статье вы узнаете, как использоватьPod,DeploymentиServiceНачните развертывание своего первого приложения

Если это может помочь вам, вы можете помочь мне вshfshanyue/op-noteПоставь на него звезду.

Pod

podдаkubernetesНаименьшая единица оркестровки в , обычно состоящая из контейнера (иногда контейнеров может быть несколько).

Ниже приведен минимальный пример файла конфигурации ресурсов модуля для подробного ознакомления с конфигурацией.kubernetes v1.16 Pod

Мы используемnginx:alpineРазвернуто как зеркалоPod, и открывает порт 80

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  # 指定 label,便于检索
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    # 指定镜像
    image: nginx:alpine
    # 指定暴露端口
    ports:
    - containerPort: 80

использоватьkubectly apply, разверните модуль

$ kubectl apply -f nginx.yaml
pod/nginx created

Проверьте статус развертывания, в настоящее время СТАТУСRunningУказывает, что развертывание прошло успешно

# 获取 Pod 部署的状态,特别是 IP
# -o wide 列出IP/Node等更多信息
$ kubectl get pods nginx -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP           NODE       NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          14m   10.244.1.9   shuifeng   <none>           <none>

использовать-o wideПолучите IP-адрес модуля, посетите IP-адрес, чтобы узнать, доступен ли он.nginxКлассическая страница конфигурации

# 获取更加详细的信息
$ kubectl describe pod nginx

# 每个 pod 都有一个IP地址,直接访问IP地址获取内容
$ curl 10.244.1.9
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

В этот момент мы можем использоватьkubectl execВходитьPodвнутреннего контейнера. еслиPodЕсть несколько контейнеров, используйтеkubectl exec -cуказанный контейнер

$ kubectl exec -it nginx sh

существуетPodВыполните команду в контейнере и проверьтеsocketСитуация и сервис nginx

# 在 POD 中执行命令

# 可以看到 nginx 起的80端口
$ netstat -tan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN

# 访问 nginx,正确返回配置页面的内容
# -q: 不输出 wget 自身信息
# -O -: 定向到标准输出
$ wget -q -O - localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Deployment

существуетk8sПриложения средней оркестровки могут лучше выполнять эластичное расширение и балансировку нагрузки. Поскольку необходима балансировка, Pod не должен быть сбалансирован, поэтому естественно развертывать несколькоPod

docker-composeможно сделать простоdocker-compose scaleрасширять,k8sНе говоря уже о.

Управление в k8sPodназываетсяController, мы можем использоватьDeploymentэтоControllerпридти дляPodДля расширения конечно может и апгрейды выкатывать, откаты, канарейки и т.д.

мы пишемDeploymentфайл конфигурации ресурсов

  • spec.template: укажите модуль для развертывания.
  • spec.replicas: укажите количество для развертывания
  • spec.selector: Найдите модуль, которым необходимо управлять.
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:alpine
        ports:
        - containerPort: 80

Мы используемkubectl applyПросмотр после того, как развертывание вступит в силуPodа такжеDeploymentгосударство

$ kubectl apply -f nginx.yaml

# nginx-deployment 部署的三个 pod 全部成功
$ kubectl get pods -o wide -l 'app=nginx'
NAME                                READY   STATUS    RESTARTS   AGE     IP            NODE       NOMINATED NODE   READINESS GATES
nginx                               1/1     Running   1          4h29m   10.244.1.9    shuifeng   <none>           <none>
nginx-deployment-54f57cf6bf-57g8l   1/1     Running   0          23m     10.244.1.10   shuifeng   <none>           <none>
nginx-deployment-54f57cf6bf-ltdf7   1/1     Running   0          23m     10.244.1.11   shuifeng   <none>           <none>
nginx-deployment-54f57cf6bf-n8ppt   1/1     Running   0          23m     10.244.1.12   shuifeng   <none>           <none>

# READY 3/3 表明全部部署成功
$ kubectl get deploy nginx-deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           23m

Service

Теперь, когда мы развернули развертывание, которое имеет три модуля и три IP-адреса, как нам запрашивать услуги у этих трех модулей, не говоря уже о том, что новые IP-адреса модуля будут генерироваться каждый раз, когда развертывание подключается к сети. т. е. как мы делаем обнаружение услуг

мы можем пройтиServiceЧтобы решить эту проблему, укажитеDeploymentили конкретный наборPodабстракция сетевого уровня

Файл конфигурации выглядит следующим образом

  1. spec.selector: указать, как выбратьPod
  2. spec.ports: указывает, как открыть порт
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

Мы используемkubectl applyПросмотр после того, как развертывание вступит в силуServiceгосударство

$ kubectl get svc nginx-service -o wide
NAME            TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE   SELECTOR
nginx-service   ClusterIP   10.108.9.49   <none>        80/TCP    11m   app=nginx

ClusterIPДоступ к репрезентативному сервису возможен только внутри кластера, в настоящее время мы получаем доступ10.108.9.49служба доступа

$ curl 10.108.9.49
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Для обнаружения службы нам нужно знать только имя службы, чтобы получить доступ к службе, и это слишком мало, чтобы получить к ней доступ только через IP.Serviceконечно не так низко

В k8s ко всем сервисам можно получить доступ черезmy-svc.my-namespace.svc.cluster.localЧтобы выполнить обнаружение службы, для только что развернутой службы этоnginx-service.default.svc.cluster.local

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

$ curl nginx-service.default.svc.cluster.local
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

резюме

по конфигурацииDeploymentиService, в этот момент мы можем получить доступ к доменному имени через обнаружение службы в кластере. Полный файл конфигурации выглядит следующим образом

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:alpine
        ports:
        - containerPort: 80

---

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

Когда нам по-прежнему необходимо предоставлять услуги в Интернете, как нам получить доступ к доменным именам за пределами кластера?

Обратите внимание на общедоступный номер

Добро пожаловать в публичный аккаунтГорная Луна Путешествие, я буду регулярно делиться некоторыми статьями о внешнем и внутреннем интерфейсе, эксплуатации и обслуживании, а также будет ежедневный обзор и сводка технологий и жизни, добро пожаловать, чтобы обратить внимание на обмен

欢迎关注公众号山月行,我会定期分享一些前后端以及运维的文章