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。

浙公网安备 33010602011771号