Kubernetes—使用Minikube搭建Nginx集群

2,426 阅读3分钟

1 安装minikube

2 通过minikube 启动k8s集群

minikube start

通过

3 创建一个deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:alpine
        ports:
        - containerPort: 80
kubectl apply -f nginx-dep.yml

为了确保集群内部的nginx服务已经启动了,我们可以进入对应的pod 去查看

kubectl exec nginx-deployment-7fb7fd49b4-29cdk -it -- /bin/sh
// 或者 kubectl exec deployment/nginx-deployment -it -- /bin/sh
curl localhost

输出如下,则代表pod内的Nginx服务已经启动了

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

4 创建 service,将Pod暴露出来

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30080
  type: NodePort
kubectl apply -f nginx-svc.yml

5 如果你使用的是minikube, 你通过minikube service nginx-service --url来获取访问入口,NodePort一般是配合externalIPs一起使用。

如果你想本地使用(通过localhost来访问),你可以使用端口转发。下面的命令就建立了一个端口转发

kubectl port-forward nginx-deployment-7d9d7464fb-mrc4h 30001:80

30001 为本机端口,80为集群内部访问端口(port)

详情阅读# 使用端口转发来访问集群中的应用

K8S 各个port关系

  • port: 是k8s集群内部访问service的端口,即通过clusterIP: port可以访问到某个service
  • nodePort: 是外部访问k8s集群中service的端口,通过nodeIP: nodePort可以从外部访问到某个service
  • targetPort: 是pod的端口,从port和nodePort来的流量经过kube-proxy流入到后端pod的targetPort上,最后进入容器
  • containerPort: 是pod内部容器的端口,targetPort映射到containerPort

image.png

Ingress

  • 查看Ingress是否开启
minikube addons list
  • 在minikube开启Ingress Controller只需要执行下面的命令
minikube addons enable ingress
  • 创建example-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    - host: hello-world.info
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web
                port:
                  number: 8080
  • 通过运行下面的命令创建 Ingress 资源
kubectl apply -f example-ingress.yaml
  • 验证 IP 地址已被设置
kubectl get ingress
  • 在 /etc/hosts 文件的末尾添加以下内容

说明: 如果你在本地运行 Minikube 环境,需要使用 minikube ip 获得外部 IP 地址。 Ingress 列表中显示的 IP 地址会是内部 IP 地址。

// 配置host
172.17.0.15 hello-world.info
  • 验证 Ingress 控制器能够转发请求流量:
curl hello-world.info

可视化界面

除了使用命令行来查看pod,service的信息,我们也可以使用可视化界面

  • 查看Minikube内置插件,默认情况下Dashboard插件未启用
minikube addons list

|-----------------------------|----------|--------------|

ADDON NAMEPROFILESTATUS
dashboardminikubedisabled
default-storageclassminikubeenabled ✅
  • 启用Dashboard插件
minikube addons enable dashboard
  • 开启Dashboard,通过--url参数不会打开管理页面,并可以在控制台获得访问路径
minikube dashboard --url
  • 要想从外部访问Dashboard,需要从使用kubectl设置代理才行,--address设置为你的服务器地址;
kubectl proxy --port=44469 --address='192.168.5.94' --accept-hosts='^.*' &
  • 从外部访问服务器需要开启防火墙端口;
# 切换到root用户
su -
# 开启端口
firewall-cmd --zone=public --add-port=44469/tcp --permanent
# 重启防火墙
firewall-cmd --reload
  • 通过如下地址即可访问Dashboard:
http://192.168.5.94:44469/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/

参考文章