要访问Kubernetes(k8s)部署的应用,可以通过Service暴露应用、使用Ingress Controller管理流量、配置外部负载均衡器等方式实现。Service暴露应用是最基础且常用的一种方法,可以通过ClusterIP、NodePort或LoadBalancer类型的Service来实现应用的访问。ClusterIP类型的Service仅在集群内部可访问,适用于内部服务之间的通信;NodePort类型的Service将应用暴露在集群节点的指定端口上,适用于开发调试阶段;LoadBalancer类型的Service则通过云提供商的负载均衡器将应用暴露到外部网络,适用于生产环境。接下来将详细介绍这些方法的具体实现步骤和注意事项。
一、SERVICE暴露应用
1、ClusterIP
ClusterIP是Kubernetes中默认的Service类型。它将Service暴露在集群内部一个虚拟IP地址上,这个IP地址仅在集群内部可访问。适用于内部服务之间的通信。
-
创建ClusterIP类型的Service:
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
以上YAML文件定义了一个名为
my-service
的Service,它将TCP 80端口的流量转发到Pod的9376端口。
2、NodePort
NodePort类型的Service将应用暴露在集群节点的指定端口上,使得集群外部能够通过节点IP和端口号访问应用。适用于开发调试阶段。
-
创建NodePort类型的Service:
apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
spec:
type: NodePort
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
nodePort: 30001
以上YAML文件定义了一个名为
my-nodeport-service
的Service,它将TCP 80端口的流量转发到Pod的9376端口,并且在集群节点的30001端口上暴露。
3、LoadBalancer
LoadBalancer类型的Service通过云提供商的负载均衡器将应用暴露到外部网络,适用于生产环境。
-
创建LoadBalancer类型的Service:
apiVersion: v1
kind: Service
metadata:
name: my-loadbalancer-service
spec:
type: LoadBalancer
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
以上YAML文件定义了一个名为
my-loadbalancer-service
的Service,它将TCP 80端口的流量转发到Pod的9376端口,并通过云提供商的负载均衡器将应用暴露到外部。
二、INGRESS CONTROLLER管理流量
Ingress Controller是Kubernetes中用于管理外部访问到集群内部服务的组件。通过定义Ingress资源来配置HTTP和HTTPS路由。
1、安装Ingress Controller
不同的云提供商和Kubernetes发行版可能会提供不同的Ingress Controller,例如NGINX Ingress Controller、Traefik、Contour等。
-
安装NGINX Ingress Controller:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
2、定义Ingress资源
Ingress资源定义了如何将外部请求路由到集群内部的Service。通过YAML文件定义路由规则。
-
创建Ingress资源:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
以上YAML文件定义了一个名为
my-ingress
的Ingress资源,它将myapp.example.com
的HTTP请求路由到my-service
的80端口。
3、配置TLS
为了保证数据传输的安全性,可以为Ingress配置TLS证书。
-
创建Secret存储TLS证书:
kubectl create secret tls my-tls-secret --cert=path/to/tls.crt --key=path/to/tls.key
-
在Ingress资源中引用TLS Secret:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-secure-ingress
spec:
tls:
- hosts:
- myapp.example.com
secretName: my-tls-secret
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
以上YAML文件定义了一个名为
my-secure-ingress
的Ingress资源,并配置了TLS证书以支持HTTPS访问。
三、配置外部负载均衡器
在一些情况下,可能需要使用外部负载均衡器将流量分发到多个Kubernetes节点上。
1、使用云提供商的负载均衡器
大多数云提供商都提供负载均衡器服务,例如AWS ELB、GCP Load Balancer、Azure Load Balancer等。可以直接通过配置LoadBalancer类型的Service来利用这些负载均衡器。
2、自定义负载均衡器
在一些特殊情况下,可能需要自定义负载均衡器,例如使用HAProxy或NGINX等软件负载均衡器。
-
配置HAProxy负载均衡器:
frontend http_front
bind *:80
default_backend http_back
backend http_back
balance roundrobin
server k8s-node1 NODE1_IP:30001 check
server k8s-node2 NODE2_IP:30001 check
以上配置文件定义了一个HAProxy负载均衡器,将HTTP请求分发到两个Kubernetes节点上。
四、访问安全性配置
为了确保访问的安全性,Kubernetes提供了多种安全机制。
1、配置网络策略
Kubernetes的网络策略(Network Policy)用于控制Pod之间的网络访问。可以定义允许或禁止特定Pod之间的通信规则。
-
创建网络策略:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-specific
spec:
podSelector:
matchLabels:
app: MyApp
ingress:
- from:
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 80
以上YAML文件定义了一条网络策略,允许带有
frontend
标签的Pod访问带有MyApp
标签的Pod的80端口。
2、配置RBAC
角色访问控制(Role-Based Access Control,RBAC)用于管理用户或服务账户对Kubernetes资源的访问权限。可以定义角色和角色绑定来控制访问权限。
-
创建角色:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
-
创建角色绑定:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
- kind: User
name: jane
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
以上YAML文件定义了一个
pod-reader
角色和一个read-pods
角色绑定,允许用户jane
读取default
命名空间中的Pod。
五、日志和监控
为了确保应用的稳定运行,需要对其进行日志和监控。
1、日志管理
可以使用ELK(Elasticsearch、Logstash、Kibana)堆栈或EFK(Elasticsearch、Fluentd、Kibana)堆栈来管理日志。
-
部署EFK堆栈:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/fluentd-elasticsearch/es-statefulset.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/fluentd-elasticsearch/es-service.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/fluentd-elasticsearch/fluentd-es-configmap.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/fluentd-elasticsearch/fluentd-es-ds.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/fluentd-elasticsearch/kibana-deployment.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/fluentd-elasticsearch/kibana-service.yaml
2、监控
可以使用Prometheus和Grafana进行监控。
-
部署Prometheus和Grafana:
kubectl apply -f https://raw.githubusercontent.com/coreos/prometheus-operator/master/bundle.yaml
kubectl apply -f https://raw.githubusercontent.com/coreos/prometheus-operator/master/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml
kubectl apply -f https://raw.githubusercontent.com/coreos/prometheus-operator/master/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml
kubectl apply -f https://raw.githubusercontent.com/coreos/prometheus-operator/master/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml
kubectl apply -f https://raw.githubusercontent.com/coreos/prometheus-operator/master/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml
kubectl apply -f https://raw.githubusercontent.com/coreos/prometheus-operator/master/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml
kubectl apply -f https://raw.githubusercontent.com/coreos/prometheus-operator/master/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml
通过上述步骤,您可以在Kubernetes集群中部署和访问应用,并确保其安全性和稳定性。
相关问答FAQs:
如何在Kubernetes(K8s)上部署完应用后进行访问?
在Kubernetes中,完成应用部署后,访问服务是一个重要的步骤。K8s通过多种方式提供对外访问的能力。以下是一些常见的方法,以帮助您了解如何在K8s上访问您的服务。
-
使用NodePort服务类型
NodePort是Kubernetes服务的一种类型,它允许用户通过指定的端口访问服务。每个Node都会开放一个特定的端口,用户可以通过该端口访问服务。具体步骤如下:- 首先,创建一个服务资源文件,类型为NodePort。以下是一个示例YAML文件:
apiVersion: v1 kind: Service metadata: name: my-service spec: type: NodePort ports: - port: 80 targetPort: 8080 nodePort: 30007 selector: app: my-app
- 使用kubectl命令应用该YAML文件:
kubectl apply -f service.yaml
- 访问应用时,只需通过任一Node的IP地址和指定的nodePort进行访问。例如,如果Node的IP为192.168.1.100,可以通过http://192.168.1.100:30007访问应用。
- 首先,创建一个服务资源文件,类型为NodePort。以下是一个示例YAML文件:
-
使用LoadBalancer服务类型
LoadBalancer类型的服务用于在云环境中自动创建负载均衡器,便于外部访问。这种方式适用于在云平台上运行Kubernetes集群。步骤如下:- 创建服务时将类型设置为LoadBalancer。以下是示例:
apiVersion: v1 kind: Service metadata: name: my-service spec: type: LoadBalancer ports: - port: 80 targetPort: 8080 selector: app: my-app
- 应用该YAML文件:
kubectl apply -f service.yaml
- 创建后,Kubernetes会自动为服务分配一个外部IP地址,您可以通过该地址访问您的应用。
- 创建服务时将类型设置为LoadBalancer。以下是示例:
-
使用Ingress资源
Ingress是一种Kubernetes资源,用于管理外部访问服务的规则。Ingress通常结合Ingress Controller使用,提供HTTP和HTTPS路由功能。以下是如何配置Ingress的步骤:- 首先,确保集群中已安装Ingress Controller,例如Nginx Ingress Controller。
- 创建Ingress资源文件,定义访问规则。以下是示例:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress spec: rules: - host: myapp.example.com http: paths: - path: / pathType: Prefix backend: service: name: my-service port: number: 80
- 应用该YAML文件:
kubectl apply -f ingress.yaml
- 设置DNS记录,将域名指向Ingress Controller的外部IP地址。完成后,您就可以通过http://myapp.example.com访问您的应用。
K8s中如何处理服务的安全性与网络策略?
在Kubernetes中,安全性和网络策略对于保护服务至关重要。以下是一些关键措施,以确保服务的安全性。
-
使用Network Policies
Network Policies允许用户定义如何在Pod之间进行网络通信。通过配置网络策略,可以限制Pod的流量,确保只有授权的Pod可以访问特定服务。- 创建一个Network Policy示例,允许只有特定标签的Pod访问:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-access spec: podSelector: matchLabels: role: my-app ingress: - from: - podSelector: matchLabels: role: allowed-app
- 应用网络策略,以增强集群的安全性。
- 创建一个Network Policy示例,允许只有特定标签的Pod访问:
-
使用RBAC(角色基础访问控制)
Kubernetes提供了RBAC功能,允许您对集群中的资源进行细粒度的权限管理。通过创建角色和角色绑定,可以控制谁可以访问哪些资源。- 创建一个角色示例,允许特定用户查看Pod:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: pod-reader rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "watch"]
- 通过角色绑定将角色分配给用户:
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: read-pods subjects: - kind: User name: john apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: pod-reader apiGroup: rbac.authorization.k8s.io
- 创建一个角色示例,允许特定用户查看Pod:
-
使用TLS加密通信
在Kubernetes中启用TLS可以确保数据在传输过程中保持安全。可以通过Ingress或直接在服务中配置TLS证书,以加密与外部的通信。- 在Ingress中配置TLS:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress spec: tls: - hosts: - myapp.example.com secretName: my-tls-secret rules: - host: myapp.example.com http: paths: - path: / pathType: Prefix backend: service: name: my-service port: number: 80
- 在Ingress中配置TLS:
通过以上方式,您可以在K8s中有效地访问和保护您的服务。无论是使用NodePort、LoadBalancer还是Ingress,选择合适的方法将使您的应用更易于访问,并确保其安全。
关于 GitLab 的更多内容,可以查看官网文档:
官网地址: https://gitlab.cn
文档地址: https://docs.gitlab.cn
论坛地址: https://forum.gitlab.cn
原创文章,作者:DevSecOps,如若转载,请注明出处:https://devops.gitlab.cn/archives/49691