вводить
Несколько статей впереди представлены с уровня концепции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 и порта, найденных в вашей собственной практике) Результаты доступа к двум маршрутам, определенным приложением, следующие:
Суммировать
Сегодняшняя статья кратко описывает развертывание приложений наKubernetesкластерные шаги,KubernetesСуществует множество объектов для представления различных ресурсов в собственных, сегодня развернутых приложениях.Deploymentявляется одним из них,kubectlбудет основываться на.yamlЗапрос информации о конфигурации в файлеKubernetesизapiServerЧтобы создавать различные объекты, нам нужно продолжить изучение этих часто используемых объектов.Kubernetesобъект. Поскольку я только что начал учиться, неизбежно, что в выражении есть неточности, пожалуйста, прости меня.