Учебное пособие по внешним службам в 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.