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

查看服务:

kubectl查看nginx容器位置 kubectl run nginx_kubectl查看nginx容器位置


对外暴露的端口是31168,外部访问:

kubectl查看nginx容器位置 kubectl run nginx_kubernetes_02

除此之外,在集群中部署服务还有很多种方式,这里介绍几种常见的方式,关于端口,有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提供服务如下:

kubectl查看nginx容器位置 kubectl run nginx_kubernetes_03


红色部分为发布的nginx应用,可以看到服务集群的ip地址以及端口号为80,可以在minikube集群内部访问该服务集群的ip地址和端口来访问该nginx服务;也可以在外部通过访问该服务所在节点的ip地址以及对外暴露的端口号31685去访问该服务

集群内部访问:

kubectl查看nginx容器位置 kubectl run nginx_nginx_04


外部访问:

kubectl查看nginx容器位置 kubectl run nginx_端口号_05

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文件内容为:

kubectl查看nginx容器位置 kubectl run nginx_nginx_06

创建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

集群中的服务为:

kubectl查看nginx容器位置 kubectl run nginx_端口号_07


可以看到,该服务没有端口映射关系,这是因为该服务未公开,所以只能在集群内部访问,集群内部访问刚刚创建的服务:

kubectl查看nginx容器位置 kubectl run nginx_端口号_08


要想在外部访问服务,则需要启用proxy代理,然后通过api去访问该服务

service的类型为nodeport

yaml文件内容如下:

kubectl查看nginx容器位置 kubectl run nginx_docker_09

#创建service
kubectl create -f nginx-service-nodeport.yaml

服务如下:

kubectl查看nginx容器位置 kubectl run nginx_nginx_10


外部访问:

kubectl查看nginx容器位置 kubectl run nginx_docker_11

service类型为loadbalancer

yaml文件如下:

kubectl查看nginx容器位置 kubectl run nginx_kubectl查看nginx容器位置_12


可通过添加externalTrafficPolicy: Local字段保留客户端的源ip

服务如下:

kubectl查看nginx容器位置 kubectl run nginx_kubectl查看nginx容器位置_13


集群内访问:

kubectl查看nginx容器位置 kubectl run nginx_端口号_14


集群外访问:

kubectl查看nginx容器位置 kubectl run nginx_nginx_15

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

看到如图所示界面的红色记录即可:

kubectl查看nginx容器位置 kubectl run nginx_kubectl查看nginx容器位置_16


确保ingress启动之后,通过yaml文件创建Ingress资源,文件内容如下:

kubectl查看nginx容器位置 kubectl run nginx_docker_17


查看ingress内容:

kubectl查看nginx容器位置 kubectl run nginx_端口号_18


这里必须保证集群中存在nginxservicenodeport服务,查看ingress,有相应的地址记录即可,然后通过在虚拟机中修改hosts文件(添加记录:ADDRESS的值 HOSTS的值),访问hxy.te.com:

kubectl查看nginx容器位置 kubectl run nginx_nginx_19

为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文件

kubectl查看nginx容器位置 kubectl run nginx_kubectl查看nginx容器位置_20


更新ingress资源,也可以删除ingress再重新创建

kubectl apply -f nginx-service-ingress.yaml

访问curl -k -v https://hxy.te.com

kubectl查看nginx容器位置 kubectl run nginx_端口号_21