如何将部署在 ec2 实例上的 K8s 集群中作为 pod 运行的 Web 服务公开给外部

如何将部署在 ec2 实例上的 K8s 集群中作为 pod 运行的 Web 服务公开给外部

我已经将 kubernetes 集群(只有一个节点作为主节点)部署到 ec2 实例上。此后,我创建了一个 nginx 部署并使用“Type”作为 NodePort 公开了该服务。nginx 服务在 ec2 privateIP:31336 上可用,也可以从我的计算机通过 ec2 publicIP:31336 进行访问。

在此阶段,我有以下问题:1) 下一步该怎么做才能从集群外部访问 http 服务,即成功执行“curl ec2publicIP:80”操作?任何指南都会非常有帮助。

注意: - 我的 ec2 安全规则配置为允许 http 流量。 - 登录 nginx pod 后,我可以 ping google.com,但 apt-get 更新超时。 - 我已经更新了 EC2 实例中的 IP 转发。

2)对于 kube 服务来说,NodePort、ingress 控制器或 ELB 中最佳且简单的选项是什么。

3) 另外,IPtables 在其中扮演什么角色?能否通过使用上述任何工具或其他负责网络的工具/包来避免手动更改其规则?

非常感谢您的回复。

nginx-deployment.yaml:

apiVersion: apps/v1 kind: Deployment metadata: name: demo-nginx spec: selector: matchLabels: run: demo-nginx replicas: 1 template: metadata: labels: run: demo-nginx spec: containers: - name: demo-nginx image: k8s.gcr.io/nginx:1.7.9 ports: - containerPort: 80

nginx-services.yaml:

apiVersion: v1 kind: Service metadata: name: demo-nginx labels: run: demo-nginx spec: ports: - port: 80 protocol: TCP selector: run: demo-nginx type: NodePort

答案1

我猜你想创建一个Kubernetes 服务它将摆在你的面前。Pod 监听随机端口,而服务是负载均衡器将随机端口转换为已知的外部端口(例如 80 或 443)。

另外,你也不想单独运行 Pod。最好将它们作为部署如果它们死机了,它将负责重新启动它们。

这是一个非常简单的单 Pod 部署服务作为 AWS ELB 实现。它全部位于自己的命名空间

kind: Namespace
apiVersion: v1
metadata:
  name: demo
  labels:
    name: demo

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-deployment
  namespace: demo
  labels:
    app: demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
      - name: demo
        image: 123456789012.dkr.ecr.ap-southeast-2.amazonaws.com/demo:latest    # <<< Update
        ports:
        - containerPort: 80
          name: backend-http
        env:
        - name: SOME_API
          value: https://example.com/some-api


---
kind: Service
apiVersion: v1
metadata:
  name: demo
  namespace: demo
  annotations:
    # The backend talks over HTTP.
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http
spec:
  type: LoadBalancer
  selector:
    app: demo
  ports:
  - name: elb-http
    protocol: TCP
    port: 80
    targetPort: backend-http

您会注意到,它在模板中引用的是端口 80,尽管实际上它是 k8s 分配的一个随机数。但 Pod 认为它在端口 80 上监听,所以这就是我们在模板中引用的内容。

您可以部署它kubectl apply,它将创建所有内容。

希望有帮助:)

相关内容