Тысяча миль начинается с одного шага
Когда мы новичок в изучении языка программирования, мы всегда начинаем сhello, world
Начинать.
Когда мы узнаем, как развертывать приложения на k8s, разверните простойnginx
, чтобы получить доступ к его странице конфигурации. Поскольку у него есть все внутренние органы, простые функции и нет состояния, его можно использовать в качестве приложения для развертывания k8s.hello, world
.
В этой статье вы узнаете, как использоватьPod
,Deployment
иService
Начните развертывание своего первого приложения
- Адрес этой статьи:Разверните свое первое приложение с помощью k8s
- Серия статей:Руководство по эксплуатации и обслуживанию персонального сервера
Если это может помочь вам, вы можете помочь мне в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
абстракция сетевого уровня
Файл конфигурации выглядит следующим образом
-
spec.selector
: указать, как выбратьPod
-
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
Когда нам по-прежнему необходимо предоставлять услуги в Интернете, как нам получить доступ к доменным именам за пределами кластера?
Обратите внимание на общедоступный номер
Добро пожаловать в публичный аккаунтГорная Луна Путешествие, я буду регулярно делиться некоторыми статьями о внешнем и внутреннем интерфейсе, эксплуатации и обслуживании, а также будет ежедневный обзор и сводка технологий и жизни, добро пожаловать, чтобы обратить внимание на обмен