Практика по началу работы с Kubernetes — развертывание и запуск проектов Go

Go

вводить

Несколько статей впереди представлены с уровня концепцииKubernetesКакова его внутренняя структура. А также установить на компьютерMinikube--имеет один узелKubernetesКластер, позволяющий нам начать опыт на нашем собственном компьютереKubernetes. В сегодняшней статье я постараюсь сделать его с вами шаг за шагом.GoПрограммыDockerобраз, разверните его наMinikuebeзапускать на.今天的文章不需要什么基础,KubernetesНачинающие друзья первыми учатся водить вместе.

код приложения

мы используемGoнаписать простойHTTP Server,Serverпрослушивание порта 3000 содержит"/"и"/health_check"Две маршруты, сегодня фокус статьи не в том, как использоватьGoпрограмма развития так что всеHello WorldКод уровня больше объяснять не буду, просто посмотрите код.

package main

import (
	"fmt"
	"net/http"
)

func index(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "<h1>Hello World</h1>")
}

func check(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "<h1>Health check</h1>")
}

func main() {
	http.HandleFunc("/", index)
	http.HandleFunc("/health_check", check)
	fmt.Println("Server starting...")
	http.ListenAndServe(":3000", nil)
}

Сделать образ программы

Затем начните создавать код, содержащий код приложения.Dockerзеркало. оdockerКак пользоваться и как писатьDockerfile, вы можете ответить на ключевые слова на официальном аккаунтеdockerПолучить полные справочные примечания.

dockerfile

В корневой каталог приложения добавьте файл с именемDockerfileфайл, добавьте в файл следующие инструкции:

FROM golang:alpine
RUN mkdir /app
COPY . /app
WORKDIR /app
RUN go build -o main . 
CMD ["/app/main"]

построить образ

существуетDockerfileВыполнить в каталоге, где он находитсяdocker buildпостроить образ

➜  docker build -t go-app-img .

dockerбудет основываться наDockerfileИнструкции в зеркале сборки, весь процесс сборки аналогичен следующему:

➜  docker build -t go-app-img .
Sending build context to Docker daemon  9.216kB
Step 1/6 : FROM golang:alpine
alpine: Pulling from library/golang
df20fa9351a1: Pull complete 
ed8968b2872e: Pull complete 
a92cc7c5fd73: Pull complete 
9e0cccf56431: Pull complete 
cbe0275821fc: Pull complete 
Digest: sha256:6042b9cfb4eb303f3bdcbfeaba79b45130d170939318de85ac5b9508cb6f0f7e
Status: Downloaded newer image for golang:alpine
 ---> 3289bf11c284
Step 2/6 : RUN mkdir /app
 ---> Running in b34dccb1f3de
Removing intermediate container b34dccb1f3de
 ---> 1fa1a1c21aa2
Step 3/6 : COPY . /app
 ---> 815660da9d1a
Step 4/6 : WORKDIR /app
 ---> Running in 49dc25fe6bb7
Removing intermediate container 49dc25fe6bb7
 ---> 14776702ccf7
Step 5/6 : RUN go build -o main .
 ---> Running in 3bd4dc1e2bf6
Removing intermediate container 3bd4dc1e2bf6
 ---> 59aa7f96ee42
Step 6/6 : CMD ["/app/main"]
 ---> Running in 6309f604d662
Removing intermediate container 6309f604d662
 ---> 023baffdcb28
Successfully built 023baffdcb28
Successfully tagged go-app-img:latest

Проверьте образ

Этот шаг на самом деле можно пропустить, но для того, чтобы убедиться, что полученное изображение не представляет проблемы, мы передаемdocker runКоманда для запуска контейнера с этим образом для проверки.

➜ docker run -d -p 3333:3000 --rm --name go-app-container go-app-img

Здесь мы указываемdockerЗеркалоgo-app-imgЗапустите контейнер, установите порт хоста3333Привязать к внутреннему порту контейнера3000, запустить контейнер в фоновом режиме (-d), назвать контейнерgo-app-containerи автоматически удалить контейнер (--rm) после завершения работы контейнера.

Открыть ввод в браузереlocalhost:3333Вывод посещенной страницы будет:

图片

Нажмите зеркало в Dockerhub

После того, как тестовое изображение в порядке, нажмите изображение наDockerHub,Тем временемKubernetesПри развертывании приложения оно будет основано на указанном имени образа изDockerHubПоднимите зеркало (источник зеркала настраивается, не обязательноDockerHub, который может быть частным зеркальным репозиторием).

➜  docker build -t kevinyan001/kube-go-app .   
...

➜  docker push  kevinyan001/kube-go-app
...

использоватьDockerfileПересоберите образ и укажите имя репозитория образа. После завершения сборки загрузите образ наDockerHubначальство.

На имя склада вышеkevinyan001мой собственныйDockerHubучетной записи, вы можете напрямую использовать следующую команду, чтобы получить мое зеркало для использования, но все же рекомендуется, чтобы каждый сделал свое собственное зеркало.

docker pull kevinyan001/kube-go-app:latest

Приложение для развертывания Kubernetes

Чтобы развернуть приложение, вам нужно сначала определить ожидаемое состояние, т.yamlПодайте заявление о конкретномKubernetesРазличные ожидаемые состояния объекта. тогда пустьKubernetesПосле создания объекта он всегда будет переводить текущее состояние кластера в ожидаемое состояние (например, если узел выйдет из строя, будет запущен новый узел, чтобы заменить отказавший узел). После развертывания приложения нам также необходимо пройтиServiceОткройте приложение снаружи, чтобы оно могло получить доступKubernetesприложения в кластере.

Давайте выполним эти три шага шаг за шагом.

Прежде чем мы начнем, нам нужно начатьMinikube

minikube start

Если вы не установили, можете обратиться к."Minikube — кластер Kubernetes, работающий на ноутбуке"Этапы установки в

Определите ожидаемое состояние

В файле манифеста развертывания (deployment.yaml) определяют ожидаемое состояние в

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-go-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: go-app
  template:
    metadata:
      labels:
        app: go-app
    spec:
      containers:
        - name: go-app-container
          image: kevinyan001/kube-go-app
          resources:
            limits:
              memory: "128Mi"
              cpu: "500m"
          ports:
            - containerPort: 3000

Kubernetes Deploymentобъект (файл манифестаkindГде указано) представляют приложения, работающие в кластере. Документ также указывает необходимость копии приложения для запуска (replicas), а также имя запущенного контейнера, образ контейнера, размер ресурса и другую информацию.

DeploymentдаKubernetesОдин тип объекта, есть много других объектов, соответствующихKubernetesразличные виды ресурсов.

Развернуть приложение

используя вышеописанноеdeployment.yamlСоздайтеDeploymentобъект для запускаGoКонтейнер приложения:

➜ kubectl create -f deployment.yaml
deployment.apps/my-go-app created

➜ kubectl get deployments
NAME        READY     UP-TO-DATE   AVAILABLE   AGE
my-go-app   1/1       1            1           24s

➜ kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
my-go-app-5bb8767f6d-2pdtk   1/1       Running   0          43s

Разоблачить приложение

После развертывания приложения доступ к нему извне невозможен.DeploymentОбъект запускает приложение какKubernetesодин изServiceЗарубежная экспозиция.

➜ kubectl expose deployment my-go-app --type=NodePort --name=go-app-svc --target-port=3000 
service/go-app-svc exposed

➜ kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
go-app-svc   NodePort    10.104.190.231   <none>        3000:31425/TCP   40h
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP          6d13h

➜ minikube ip
192.168.64.4

пройти черезkubectl get svcЗапросServiceхост доступен31425порт сопоставлен сKubernetesконтейнер, в котором запущено приложение3000порт. использовать в браузереKubernetesКластер IP плюсNodePortполучить доступKubernetesразвернутыйGoприменение.

Откройте браузер через192.168.64.4:31425(На основе IP и порта, найденных в вашей собственной практике) Результаты доступа к двум маршрутам, определенным приложением, следующие:

IndexPage

HealthCheckPage

Суммировать

Сегодняшняя статья кратко описывает развертывание приложений наKubernetesкластерные шаги,KubernetesСуществует множество объектов для представления различных ресурсов в собственных, сегодня развернутых приложениях.Deploymentявляется одним из них,kubectlбудет основываться на.yamlЗапрос информации о конфигурации в файлеKubernetesизapiServerЧтобы создавать различные объекты, нам нужно продолжить изучение этих часто используемых объектов.Kubernetesобъект. Поскольку я только что начал учиться, неизбежно, что в выражении есть неточности, пожалуйста, прости меня.