k8s:DaemonSet部署nginx解决的问题 ?

Daemonset案例

引入问题:

采用NodePort方式暴露服务面临的问题是,服务一旦多起来,NodePort在每个节点上开启的端口会及其庞大,而且难以维护;这时,我们能否使用一个Nginx直接对内进行转发呢?众所周知的是,Pod与Pod之间是可以互相通信的,而Pod是可以共享宿主机的网络名称空间的,也就是说当在共享网络名称空间时,Pod上所监听的就是Node上的端口。那么这又该如何实现呢?简单的实现就是使用 DaemonSet 在每个Node上监听 80,然后写好规则,因为Nginx外面绑定了宿主机80端口(就像NodePort),本身又在集群内,那么向后直接转发到相应 Service IP 就行了

DaemonSet Nginx Pod与后端Pod交互原理:
1、共享网络命名空间:当Pod运行在共享网络命名空间中时,它可以直接使用宿主机的网络栈。这意味着Pod可以监听宿主机的端口,就像它们是宿主机上的应用一样。

2、NodePort与Service:在Kubernetes中,Service可以暴露Pod的网络端点。NodePort类型会在每个节点上开放一个端口,允许外部流量通过这个端口访问Service。Service通过ClusterIP在集群内部进行通信。

3、DaemonSet Nginx配置:在DaemonSet中,Nginx的配置文件(通常是nginx.conf)需要包含对后端Service的引用。这可以通过定义upstream块来实现,其中包含后端Service的ClusterIP和端口。
1、帮我创建pod直接使用宿主机的网络栈、daemonset类型的nginx 
2、创建一个后端clusterIP类型的svc、pod为java服务、svc为jigaobo-java-deployment  端口为8899
3、帮我在nginx里面配置上、访问www.jigaobo.com 代理到后端svc为jigaobo-java-deployment 

1、创建configmap和daemonset类型的pod

nginx-configmap.yaml:

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  nginx.conf: |
    http {
        upstream jigaobo-java {
            server jigaobo-java-deployment.default.svc.cluster.local:8899;
        }

        server {
            listen 80;
            server_name www.jigaobo.com;

            location / {
                proxy_pass http://jigaobo-java;
            }
        }
    }

nginx-daemonset.yaml:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx-daemonset
spec:
  selector:
    matchLabels:
      app: nginx-daemonset
  template:
    metadata:
      labels:
        app: nginx-daemonset
    spec:
      hostNetwork: true
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
        volumeMounts:
        - name: nginx-config
          mountPath: /etc/nginx/nginx.conf
          subPath: nginx.conf
      volumes:
      - name: nginx-config
        configMap:
          name: nginx-config

2. 创建后端ClusterIP类型的Service和Pod:

java-deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jigaobo-java-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: jigaobo-java
  template:
    metadata:
      labels:
        app: jigaobo-java
    spec:
      containers:
      - name: java-service
        image: your-java-image:tag
        ports:
        - containerPort: 8899

java-service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: jigaobo-java-service
spec:
  selector:
    app: jigaobo-java
  ports:
    - protocol: TCP
      port: 8899
      targetPort: 8899
  type: ClusterIP

3、启动

kubectl apply -f nginx-configmap.yaml
kubectl apply -f nginx-daemonset.yaml
kubectl apply -f java-deployment.yaml
kubectl apply -f java-service.yaml

4、注意事项:

确保您的Java服务镜像your-java-image:tag是可用的,并且监听在容器的8899端口上。
确保您的Kubernetes集群允许DaemonSet在所有节点上运行,特别是如果您的集群有特定节点角色(如master节点)。
如果您的集群启用了网络策略,确保它们允许所需的流量。
确保您的域名www.jigaobo.com已经正确配置了DNS记录,指向Kubernetes集群的入口地址,以便外部流量可以到达Nginx。
posted @ 2024-12-25 18:35  姬高波  阅读(37)  评论(0)    收藏  举报