1. 安装
1.1. 环境类型
k8s 的安装可以分为三种:
1.1.1. 学习环境
在学习环境中,主要使用 Minikube。
Minikube 是一种可以让你在本地轻松运行 Kubernetes 的工具。 Minikube 在笔记本电脑上的虚拟机(VM)中运行单节点 Kubernetes 集群, 供那些希望尝试 Kubernetes 或进行日常开发的用户使用。
1.1.1.1. 安装 Minikube
Minikube 的安装参考:安装 Minikube,主要流程大致如下:
- 检查环境
- 安装
kubectl,参考:安装 kubectl
- 启用 kubectl 的 shell 自动补全功能,参考:kubectl shell 自动补全
- 安装
Hypervisor,安装 VirtualBox
- 安装
Minikube
Mac 的安装过程大致如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
sysctl -a | grep -E --color 'machdep.cpu.features|VMX'
brew install kubernetes-cli
kubectl version --client
git clone https://github.com/evanlucas/fish-kubectl-completions ln -s -f fish-kubectl-completions/kubectl.fish ~/.config/fish/completions/kubectl.fish
brew install minikube
|
1.1.1.2. 启动 Minikube
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
minikube start --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers
minikube status
kubectl cluster-info
kubectl get nodes
kubectl describe node <node-name>
minikube ssh
minikube delete
minikube stop
|
1.1.1.3. 部署简单服务
1.1.1.3.1. 编写一个简单 Web 服务
一个简单的 Web 服务,输出相应的主机名称。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| # app.js
const http = require('http') const os = require('os')
console.log("Kubia server starting....");
var handler = function (request, response) { console.log("Received request fromt " + request.connection.remoteAddress); response.writeHead(200); response.end("You've hit " + os.hostname() + "\n"); };
var www = http.createServer(handler);
www.listen(8080);
|
1.1.1.3.2. 制作 Docker 镜像
编写一个 Dokcerfile,然后编译服务为一个 Docker 镜像。
1 2 3 4 5
| FROM node:7
ADD app.js /app.js
ENTRYPOINT ["node", "app.js"]
|
编译并发布镜像:
1 2 3 4 5 6 7 8 9 10 11
| docker build -t yuanmomo/kubia:latest .
docker run --name kubia-test -p 8080:8080 yuanmomo/kubia:latest
docker login -u xxx -p xxx
docker push yuanmomo/kubia:latest
|
提示:
- 因为 k8s 集群运行在 Mac 的虚拟机中,所以在集群中部署服务时,会自动从仓库中拉取镜像,而不能使用 Mac 本地的镜像,所以一定要将镜像推送到远程仓库。否在在部署服务时,会出现
ImagePullBackOff 错误。
- 可以对
kubelet 做一个别名:alias k="kubelet"
1.1.1.3.3. 部署应用
使用 使用 kubectl run 部署应用(创建容器):
1 2 3 4 5 6
| kubectl run kubia --image=yuanmomo/kubia:latest --port=8080 --generator=run-pod/v1
kubectl get pods
|
1.1.1.4. 访问 Web 服务
1.1.1.4.1. 创建服务对象
创建 LoadBalancer 服务:
1 2 3 4 5 6
|
» kubectl expose rc kubia --type=LoadBalancer --name kubia-http service/kubia-http exposed
|
kubectl expose 暴露的 kubia-http 也是一个服务,可以通过 kubectl get svc 查看。
1 2 3 4
| » kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4m20s kubia-http LoadBalancer 10.108.242.216 <pending> 8080:31928/TCP 3m10s
|
提示:
- 由于 Minikube 不支持 LoadBalancer 类型的服务。所以,这里不会有
<EXTERNAL-IP> 地址。
1.1.1.4.2. 获取访问地址
使用 minikube service kubia-http 获取可以访问服务的 IP 和端口。
1.1.1.5. 容器伸缩
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| » kubectl get rc NAME DESIRED CURRENT READY AGE kubia 1 1 1 13m
kubectl scale rc kubia --replicas=3
» kubectl get rc NAME DESIRED CURRENT READY AGE kubia 3 3 3 18m
» kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES kubia-bhj8q 1/1 Running 0 8s 172.18.0.6 minikube <none> <none> kubia-dhvhh 1/1 Running 0 20m 172.18.0.3 minikube <none> <none> kubia-ngrrc 1/1 Running 0 8s 172.18.0.7 minikube <none> <none>
|
访问 Web 服务地址,会发现请求会随机的落到三个容器中。

1.1.1.6. 访问 Minikube 的 dashboard