k8s部署完后如何访问

k8s部署完后如何访问

要访问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上访问您的服务。

  1. 使用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访问应用。
  2. 使用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地址,您可以通过该地址访问您的应用。
  3. 使用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中,安全性和网络策略对于保护服务至关重要。以下是一些关键措施,以确保服务的安全性。

  1. 使用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
      
    • 应用网络策略,以增强集群的安全性。
  2. 使用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
      
  3. 使用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
      

通过以上方式,您可以在K8s中有效地访问和保护您的服务。无论是使用NodePort、LoadBalancer还是Ingress,选择合适的方法将使您的应用更易于访问,并确保其安全。

关于 GitLab 的更多内容,可以查看官网文档:
官网地址: https://gitlab.cn 
文档地址: https://docs.gitlab.cn 
论坛地址: https://forum.gitlab.cn 

原创文章,作者:DevSecOps,如若转载,请注明出处:https://devops.gitlab.cn/archives/49691

(0)
DevSecOpsDevSecOps
上一篇 2024 年 7 月 24 日
下一篇 2024 年 7 月 24 日

相关推荐

  • k8s如何添加多个网站

    在Kubernetes(K8s)中添加多个网站的关键步骤包括创建多个部署和服务、配置Ingress资源、使用命名空间进行隔离。其中,配置Ingress资源是至关重要的一步,通过配置…

    2024 年 7 月 26 日
    0
  • k8s中如何查看dns信息

    在Kubernetes(k8s)中查看DNS信息可以通过以下几种方式:使用kubectl命令查看kube-dns/coredns日志、通过kubectl exec命令进入Pod查看…

    2024 年 7 月 26 日
    0
  • k8s应用如何获取集群信息

    K8s应用获取集群信息的方法有多种:通过Kubernetes API、使用kubectl命令行工具、配置文件和环境变量。其中,通过Kubernetes API获取信息最为常见,因为…

    2024 年 7 月 26 日
    0
  • 如何从rancher导出k8s配置

    要从Rancher导出Kubernetes配置,可以通过使用Rancher UI导出、使用kubectl命令行工具导出、使用Rancher API导出三种主要方式实现。使用Ranc…

    2024 年 7 月 26 日
    0
  • k8s一台服务器怎么搭建

    要在一台服务器上搭建Kubernetes (K8s),需要完成以下几步:安装Docker、配置Kubernetes仓库、安装Kubeadm、Kubelet和Kubectl、初始化K…

    2024 年 7 月 26 日
    0
  • k8s怎么保证容器重启数据不丢失

    在Kubernetes(K8s)环境中,保证容器重启数据不丢失的核心措施有:使用持久卷(Persistent Volume, PV)、配置持久卷声明(Persistent Volu…

    2024 年 7 月 26 日
    0
  • k8s怎么设置双向认证

    K8s可以通过配置API Server和集群节点的证书及密钥来实现双向认证,这包括生成和配置客户端证书、配置API Server以信任这些证书、在kubelet和kubectl中配…

    2024 年 7 月 26 日
    0
  • 企业k8s怎么管理的

    企业Kubernetes(K8s)管理的核心在于自动化、可扩展性、安全性、监控和日志管理。其中,自动化是实现高效管理的关键。通过自动化工具和脚本,企业可以大大简化Kubernete…

    2024 年 7 月 26 日
    0
  • k8s怎么启动容器

    要在Kubernetes(k8s)中启动容器,可以通过创建Pod、Deployment、Service等资源对象来实现,这些资源对象通过YAML文件进行定义,并使用kubectl命…

    2024 年 7 月 26 日
    0
  • 如何向k8s集群提交作业

    要向Kubernetes集群提交作业,可以通过kubectl命令、配置YAML文件、以及使用Helm或Operator等工具。 通过kubectl命令可以直接与K8s API交互,…

    2024 年 7 月 26 日
    0

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

GitLab下载安装
联系站长
联系站长
分享本页
返回顶部