k8s (一) 学习环境 Kubernetes 集群搭建
一、安装 Docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
镜像加速(本文使用阿里云镜像):
## vi /etc/docker/daemon.json
{"registry-mirrors":["https://<你的ID>.mirror.aliyuncs.com"]}
## systemctl daemon-reload
## systemctl restart docker
备注:本文使用的镜像为 luksa/kubia,是《Kubernetes in Action》中使用的镜像,其为一个简单的 Node.js 应用:
const http = require('http'); const os = require('os'); console.log("Kubia server starting..."); var handler = function(request, response) { console.log("Received request form " + request.connection.remoteAddress); response.writeHead(200); response.end("You've hit " + os.hostname() + "\n"); }; var www = http.createServer(handler); www.listen(8080);
Dockerfile 文件的内容为:
FROM node:7 ADD app.js /app.js ENTRYPOINT ["node", "app.js"]
二、配置 k8s 集群
Minikube 是一个构建单节点集群的工具,是运行 Kubemetes 集群最简单、最快捷的途径
2.1. 安装 kubectl
官方给出地址是:https://storage.googleapis.com ,需要梯子才能使用,改为使用阿里云的下载地址:
curl -Lo kubectl http://kubernetes.oss-cn-hangzhou.aliyuncs.com/kubernetes-release/release/v1.20.0/bin/linux/amd64/kubectl && chmod +x ./kubectl && mv ./kubectl /usr/local/bin/kubectl
验证是否成功:kubectl version --client
2.2. 安装 minikube
同样使用阿里云的下载地址:
curl -Lo minikube http://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/releases/v1.16.0/minikube-linux-amd64 && chmod +x ./minikube && mv ./minikube /usr/local/bin/minikube
启动集群:minikube start --driver=none
查看集群(前提是已经安装了 kubectl):kubectl get pod -A # pod 可以缩写为 po
遇到的报错:
- Sorry, Kubernetes 1.20.0 requires conntrack to be installed in root’s path
## 安装 conntrack: yum install conntrack
- /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables #/pro的配置文件根据实际环境来
三、部署应用
3.1. 部署应用
kubectl create deployment hello-minikube --image=luksa/kubia
3.1.1. pod
一个 pod 是一组紧密相关的容器,它们总是一起运行在同一个工作节上,以及同一个 Linux 命名空间中。每个 pod 就像一个独立的逻辑机器,拥有自己的 IP、主机名、进程等,运行一个独立的应用程序。应用程序可以是单个进程,运行在单个容器中,也可以是一个主应用进程或者其他支持进程,每个进程都在自己的容器中运行一个 pod 的所有容器都运行在同一个逻辑机器上,而其他 pod 中的容器,即使运行在同个工作节点上,也会出现在不同的节点上。
可以通过下面命令查看 pod 列表:kubectl get pods kubectl get pods -o wide # 显示 pod 运行的 IP 和所运行的节点
3.2. 创建服务对象
每个 pod 都有自己的 IP 地址,但是这个地址是集群内部的,不能从集群外部访问。要让 pod 能够从外部访问,需要通过服务对象公开它,要创建一个特殊的 LoadBalancer 类型的服务。因为如果你创建一个常规服务(一个 ClusterIP 服务),比如 pod,它只能从集群内部访问。通过创建 LoadBalancer 类型的服务,将创建一个外部的负载均衡,可以通过负载均衡的公共 IP 访问 podkubectl expose deployment hello-minikube --type=NodePort --port=8080
可以通过下面命令查看服务列表:kubectl get services
如果执行上面的命令可以看到服务是没有外部 IP 的,可以使用下面命令为其分配端口:也可以使用下面命令指定端口:minikube service hello-minikube # 本文分配的端口为:31526
kubectl port-forward service/hello-minikube 7080:8080 # 可以通过 http://localhost:7080 访问
3.3. 水平伸缩应用
可以通过下面命令查看 Deployment 列表:kubectl get deployments
默认只有 1 个 pod 副本,可以增加 pod 副本的数量:kubectl scale deployment hello-minikube --replicas 3
再次执行查看 Deployment 列表命令,可以看到目标数量变成了 3(需要等待一段时间 3 个 pod 才能都启动),等 3 个 pod 都成功启动后,多次调用接口,可以看到有不同的输出:
curl http://192.168.12.130:31526 # 31526 为本文分配的端口
## You've hit hello-minikube-6895494d6d-wsfmx
## You've hit hello-minikube-6895494d6d-cbsnz
## You've hit hello-minikube-6895494d6d-rvgvw
参考:
- 《Kubernetes in Action》
- Install and Set Up kubectl
- minikube start