minikube集群中部署nginx
- 1.通过kubectl expose的方式将资源发布
- 2.通过deployment方式部署
- 3.通过创建service资源去部署nginx
- service类型为cluster ip
- service的类型为nodeport
- service类型为loadbalancer
- 4.通过Ingress发布服务
- 为ingress创建TLS认证,从而可以使用HTTPS去访问服务
在集群中部署nginx服务,需要用pod去提供应用,可以通过rc、rs、deployment等管理工具去创建pod,也可以直接创建pod(kubectl run),还可以根据yaml文件去创建pod,其本质都是通过文件去创建
创建pod资源的yaml文件如下:
apiVersion: v1
kind: Pod # 创建的是Pod类型
metadata: # 元数据, 一些基础信息
name: nginx # 名称
labels:
app: MyApp # 标签
spec:
containers:
- name: pod-nginx # 容器名称
image: nginx:latest # 使用的镜像
ports:
- containerPort: 80 # 容器监听的端口号
然后创建pod
#方法一:基于yaml文件创建pod
kubectl create -f pod-nginx.yaml
#方法二:直接创建pod
kubectl run nginx --image=nginx
1.通过kubectl expose的方式将资源发布
直接expose
kubectl expose pod nginx --port=80 --type=NodePort
查看服务:
对外暴露的端口是31168,外部访问:
除此之外,在集群中部署服务还有很多种方式,这里介绍几种常见的方式,关于端口,有port、targetport和nodeport。targetport是指pod内容器开放的端口,该端口一定要和pod容器中的镜像开放的端口一致,否则访问不了,port是service集群开放的端口,用于在集群内部访问,nodeport是node节点开放的端口,用于在外部访问服务
2.通过deployment方式部署
可以通过deployment去管理pod,然后对外暴露deployment资源
deployment的yaml文件如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx #可以不写该字段,默认和pod模板中的label一样
replicas: 1 #指定副本数
template:
metadata:
labels:
app: nginx ##必须和spec中的label一样
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
具体操作如下:
#创建deployment资源
kubectl create -f nginx-deployment.yaml
#发布服务
kubectl expose deployment nginx-deployment --type=LoadBalancer
#查看服务
kubectl get svc
minukube提供服务如下:
红色部分为发布的nginx应用,可以看到服务集群的ip地址以及端口号为80,可以在minikube集群内部访问该服务集群的ip地址和端口来访问该nginx服务;也可以在外部通过访问该服务所在节点的ip地址以及对外暴露的端口号31685去访问该服务
集群内部访问:
外部访问:
3.通过创建service资源去部署nginx
service是一组提供相同服务的pod对外访问的端口,其ip是固定的,无论内部提供服务的pod ip如何变化,用户都能通过service的ip和端口去访问服务。且service默认只支持4层负载均衡的访问,可用ingress提供七层的负载均衡
service有几种类型cluser ip、nodeport、loadbalancer和externalname
ClusterIP 服务是 Kubernetes 的默认服务。它给你一个集群内的服务,集群内的其它应用都可以访问该服务。集群外部无法访问它。可以通过 Kubernetes 的 proxy 模式来访问该服务
NodePort 服务是引导外部流量到你的服务的最原始方式,nodepot的每个端口对应一种服务,且端口范围在30000-32767之间,可由用户自己指定端口,默认是自动选择开放端口
loadbalancer要借助于云提供商,在外部提供负载均衡器,通过访问负载均衡器,然后负载均衡器将流量转发到服务来暴露集群中的服务,且每一个由LoadBalancer 暴露的服务都会有它自己的 IP 地址,而每一个负载均衡器均需要付费,因此代价很昂贵。minikube中若想要访问loadbalancer类型的服务,则只能通过访问节点:端口号去访问。
externalname是根据域名转发去提供服务的
service类型为cluster ip
service的yaml文件内容为:
创建pod,并给pod添加标签,这里使用现有的pod,给其添加label即可
#显示集群中的pod信息,包括label和ip等
kubectl get pods --show-labels -o wide
#给pod添加标签
kubectl label pod pod-learning app=MyApp
#创建服务
kubectl create -f nginx-service1.yaml
集群中的服务为:
可以看到,该服务没有端口映射关系,这是因为该服务未公开,所以只能在集群内部访问,集群内部访问刚刚创建的服务:
要想在外部访问服务,则需要启用proxy代理,然后通过api去访问该服务
service的类型为nodeport
yaml文件内容如下:
#创建service
kubectl create -f nginx-service-nodeport.yaml
服务如下:
外部访问:
service类型为loadbalancer
yaml文件如下:
可通过添加externalTrafficPolicy: Local字段保留客户端的源ip
服务如下:
集群内访问:
集群外访问:
4.通过Ingress发布服务
Ingress会根据请求的主机名和路径决定请求转发的服务,因为转发了数据包,所以源IP地址会进行nat转换,因此看不到客户端的IP地址
minikube中开启ingress功能,开启该功能之前,必须要保证本机的80端口没有被占用:
#查看minikube中的所有组件
minikube addons list
#启动ingress组件
minikube addons enable ingress
#查看ingress是否启动
kubectl get pods -n kube-system
看到如图所示界面的红色记录即可:
确保ingress启动之后,通过yaml文件创建Ingress资源,文件内容如下:
查看ingress内容:
这里必须保证集群中存在nginxservicenodeport服务,查看ingress,有相应的地址记录即可,然后通过在虚拟机中修改hosts文件(添加记录:ADDRESS的值 HOSTS的值),访问hxy.te.com:
为ingress创建TLS认证,从而可以使用HTTPS去访问服务
#创建私钥和证书
openssl genrsa -out tls.key 2048
openssl req -new -x509 -key tls.key -out tls.cert -days 360 -subj /CN=hxy.te.com
#创建secret
kubectl create secret tls tls-secret --cert=tls.cert --key=tls.key
然后修改ingress的yaml文件
更新ingress资源,也可以删除ingress再重新创建
kubectl apply -f nginx-service-ingress.yaml
访问curl -k -v https://hxy.te.com