我已经将 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
,它将创建所有内容。
希望有帮助:)