Учебное пособие по внешним службам в Kubernetes
Адрес статьи:blog.Park Ruiqing.com/2019/10/20/…
предисловие
Благодаря предыдущему объяснению,"Сборка K8S с нуля с официальной документацией",«Развертывание приложений»Я полагаю, что читатели имеют определенное представление об установке и развертывании приложений Kubernetes.Далее в этой статье объясняется, как предоставлять службы внешнему миру.
Прочитав эту статью, вы получите:
- Узнайте о нескольких вариантах представления сервисов в Kubernetes, их плюсах и минусах.
Для прочтения этой статьи вам понадобится:
- Узнайте об основных командах Kubernetes.
- Иметь среду Kubernetes
Несколько способов предоставления услуг внешним клиентам
- пройти через
port-forward
Переадресация, о которой говорилось в предыдущей статье, проста в эксплуатации и подходит для отладки,Не подходит для производственных сред. - пройти через
NodePort
, в это время каждый узел (Node) в кластере будет слушать указанный порт, и мы сможем получить доступ к указанному сервису через порт любого узла, однако слишком много сервисов откроют большое количество портов и их будет сложно поддерживать. - пройти через
LoadBalance
выставить услугу.LoadBalance(负载均衡 LB)
Обычно предоставляется поставщиком облачных услуг, если услуга LB не предоставляется в облачной среде, мы обычно используем ее напрямую.Ingress
или используйтеMetalLB
Настройте ЛБ самостоятельно. - пройти через
Ingress
Выставляйте несколько сервисов.Ingress
Разоблачение из-за пределов кластера внутри кластераservices
Маршрутизация HTTP и HTTPS.Ingress
Правила, определенные на ресурсе, контролируются.В случае, если поставщик облачных услуг не предоставляет услуги LB, мы можем напрямую использоватьIngress
для предоставления услуги. (В качестве альтернативы используйтеLB + Ingress
Схема развертывания позволяет избежать затрат, вызванных слишком большим количеством LB-приложений).
Подготовить
Прежде чем начать, автор создал тестовое приложение, и его код слишком длинный, чтобы его здесь опустить.Приложение 1]иПриложение[2]
мы проходимkubectl get pods
См. список подов.
Упоминается, что мы можем пройти
--namespace
Параметр для просмотра списка подов в указанном пространстве имён, также можно передать--all-namespaces
чтобы увидеть список модулей во всех пространствах имен.Поскольку пространство имен не указано, приложение помещается в
default
бинго.
[root@nas-centos1 k8s-test]# kubectl get pods --namespace default
NAME READY STATUS RESTARTS AGE
k8s-test-578b77cd47-sw5pd 1/1 Running 0 6m29s
k8s-test-578b77cd47-v6kmp 1/1 Running 0 6m29s
port-forward
port-forward
Получая доступ к модулям таким образом, вы можете указать экземпляры модулей, это просто и удобно и очень подходит для отладки.
пройти черезkubectl port-forward
Чтобы настроить переадресацию:
[root@nas-centos1 k8s-test]# kubectl port-forward --address 0.0.0.0 k8s-test-578b77cd47-sw5pd 9999:8080
Forwarding from 0.0.0.0:9999 -> 8080
На этом этапе мы можем получить доступ к хосту9999
порт для доступа кk8s-test-578b77cd47-sw5pd
из8080
порт.
/k8s-test/timestamp
Это единственный API в примере приложения, который получает текущую временную метку.
[root@nas-centos1 k8s-test]# curl http://10.33.30.95:9999/k8s-test/timestamp
1571151584224
Эта статья была опубликована вБлог Пак Жуцин, перепечатка для некоммерческого использования разрешена, но перепечатка должна сохранить оригинального автораПарк Жуйцини ссылка:blog.piaoruiqing.com. Если есть какие-либо переговоры или сотрудничество с точки зрения авторизации, пожалуйста, свяжитесь с адресом электронной почты:piaoruiqing@gmail.com.
NodePort
Каждый узел (Node) в кластере будет слушать указанный порт, и мы сможем получить доступ к указанному сервису через порт любого узла, но слишком много сервисов откроют большое количество портов и будут сложны в обслуживании.
Справочная документация:Какой особенный. IO/docs/con обзор…
СоздаватьService
, и укажите его тип какNodePort
.
k8s-test-service.yaml
apiVersion: v1
kind: Service
metadata:
name: k8s-test-service
spec:
selector:
app: k8s-test
env: test
ports:
- port: 80 # 服务端口, 内部可访问
targetPort: 8080 # 目标端口, 此处指的是pod的8080端口
nodePort: 30080 # 节点端口, 外部可访问
protocol: TCP
type: NodePort
воплощать в жизньkubectl apply -f k8s-test-service.yaml
Опубликовать эту услугу.
пройти черезkubectl get services
Список услуг, которые можно просмотреть, выглядит следующим образом:
[root@nas-centos1 k8s-test]# kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
k8s-test-service NodePort 10.244.234.143 <none> 80:30080/TCP 8s
kubernetes ClusterIP 10.244.0.1 <none> 443/TCP 32d
Мы видим, что порт 30080 привязан к порту 80 службы.
Попробуйте получить доступ к приложению через узел узла:
[root@nas-centos3 ~]# curl http://10.33.30.94:30080/k8s-test/timestamp
1571152525336
LoadBalance
Справочная документация:
LoadBalance(负载均衡 LB)
Обычно предоставляется поставщиком облачных услуг. Если среда не поддерживает LB, созданный LoadBalance всегда будет в<pending>
государство:
[root@nas-centos1 k8s-test]# kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
k8s-test-service LoadBalancer 10.244.29.126 <pending> 80:32681/TCP 13s
kubernetes ClusterIP 10.244.0.1 <none> 443/TCP 33d
Если мы хотим протестировать LB в локальной среде разработки, мы можем выбратьMetalLB, Это реализация балансировки нагрузки.Метод установки здесь не раскрывается, вы можете обратиться кофициальная документация
Когда наша среда поддерживает LB, мы можем создать следующую службу для предоставления службы:
apiVersion: v1
kind: Service
metadata:
name: k8s-test-service
spec:
selector:
app: k8s-test
env: test
ports:
- port: 80 # 服务端口
targetPort: 8080 # 目标端口, 此处指的是pod的8080端口
protocol: TCP
type: LoadBalancer
воплощать в жизньkubectl apply -f k8s-test-lb.yaml
На этом этапе вы можете просмотреть команду конфигурации, выданную службе EXTERNAL-IP (10.33.30.2), следующим образом:
[root@nas-centos1 k8s-test]# kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
k8s-test-service LoadBalancer 10.244.151.128 10.33.30.2 80:31277/TCP 2s
kubernetes ClusterIP 10.244.0.1 <none> 443/TCP 33d
Попробуйте получить доступ к приложению через IP-адрес LB следующим образом:
[root@nas-centos1 k8s-test]# curl http://10.33.30.2/k8s-test/timestamp
1571235898264
Ingress
Ingress
Разоблачение из-за пределов кластера внутри кластераservices
Маршрутизация HTTP и HTTPS.Ingress
Правила, определенные в элементе управления ресурсами.Справочная документация:Это особенное GitHub.IO/ingress-что я…
Мы используем контроллер входа nginx для тестирования, сначала загрузите файл развертывания:
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
редактировать файлvim mandatory.yaml
, добавьте следующее:
template:
spec:
hostNetwork: true
-
hostNetwork
: Включите hostNetwork, что позволяет привязывать вход к портам 80 и 443 хоста. -
Есть много способов получить доступ к входу: (1) напрямую привязаться к портам 80 и 443 через hostNetwork, (2) открыть порты на узле через NodePort (но этот метод может привязывать только фиксированный диапазон портов, значение по умолчанию — 30000). -32767), (3) Через LoadBalance этот метод и NodePort фактически предоставляются через Сервис, но это разные типы Сервиса.
-
обязательный.yaml
template
Есть только один, легко найти (советы: можно использовать в vim/
искать). -
Ingress Controller
: это программа обратного прокси, которая отвечает за разбор правил обратного прокси Ingress. -
Ingress
:Ingress это правило обратного прокси.Не путайтеIngress Controller
иIngress
Концепция чего-либо.
После публикации мы создаемIngress
Тест, содержание следующее:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /k8s-test
spec:
rules:
- http:
paths:
- path: /k8s-test
backend:
serviceName: k8s-test-service
servicePort: 80
Попробуйте получить доступ:
[root@nas-centos1 ingress]# curl http://10.33.30.94/k8s-test/timestamp
1571321623058
резюме
Обычно мы будем рассматриватьLoadBalance
иIngress
Используйте вместе.С одной стороны, простое использование LB приведет к большим затратам, а с другой стороны, большое количество LB также увеличит затраты на обслуживание.Когда LB используется в сочетании с Ingress, он может достичь отличных результатов за счет различать сервисы по разным путям (здесь и принцип предоставления нескольких сервисов через Nginx в основном одинаков)
Если эта статья была вам полезна, ставьте лайк ( ̄▽ ̄)"
использованная литература
приложение
[1] Deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: k8s-test
labels:
app: k8s-test
spec:
replicas: 2
template:
metadata:
name: k8s-test
labels:
app: k8s-test
env: test
spec:
containers:
- name: k8s-test
image: registry.cn-hangzhou.aliyuncs.com/piaoruiqing/k8s-test:0.0.1
imagePullPolicy: IfNotPresent
ports:
- name: http-port
containerPort: 8080
imagePullSecrets:
- name: docker-registry-secret
restartPolicy: Always
selector:
matchLabels:
app: k8s-test
[2] K8sTestApplication.java
/**
* @author piaoruiqing
* @description: k8s test
* @date: 2019/09/22 10:01
* @since JDK 1.8
*/
@RestController
@RequestMapping(value = "/k8s-test")
@SpringBootApplication
public class K8sTestApplication {
/**
* get timestamp
* @return
*/
@GetMapping(value = "/timestamp")
public ResponseEntity<?> getTimestamp() {
return ResponseEntity.ok(System.currentTimeMillis() + "\n");
}
public static void main(String[] args) {
SpringApplication.run(K8sTestApplication.class, args);
}
}
серия статей
- Kubernetes (1) Следуйте официальной документации, чтобы собрать K8S с нуля.
- Развертывание приложений Kubernetes (2)
- Kubernetes (3) Как получить доступ к сервисам извне
Добро пожаловать в публичный аккаунт (код как поэзия):
Эта статья была опубликована вБлог Пак Жуцин, перепечатка для некоммерческого использования разрешена, но перепечатка должна сохранить оригинального автораПарк Жуйцини ссылка:blog.piaoruiqing.com. Если есть какие-либо переговоры или сотрудничество с точки зрения авторизации, пожалуйста, свяжитесь с адресом электронной почты:piaoruiqing@gmail.com.