Kubernetes(k8s)入门(安装,启动,部署服务)

1. 安装

1.1. 环境类型

k8s 的安装可以分为三种:

  • 学习环境
  • 生产环境
  • 最佳实践

1.1.1. 学习环境

在学习环境中,主要使用 Minikube。

Minikube 是一种可以让你在本地轻松运行 Kubernetes 的工具。 Minikube 在笔记本电脑上的虚拟机(VM)中运行单节点 Kubernetes 集群, 供那些希望尝试 Kubernetes 或进行日常开发的用户使用。

1.1.1.1. 安装 Minikube

Minikube 的安装参考:安装 Minikube,主要流程大致如下:

  1. 检查环境
  2. 安装 kubectl,参考:安装 kubectl
    1. 启用 kubectl 的 shell 自动补全功能,参考:kubectl shell 自动补全
  3. 安装 Hypervisor,安装 VirtualBox
  4. 安装 Minikube

Mac 的安装过程大致如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
## 检查 macOS 是否支持虚拟化技术
# 如果你在输出结果中看到了 VMX (应该会高亮显示)的字眼,说明你的电脑已启用 VT-x 特性。
sysctl -a | grep -E --color 'machdep.cpu.features|VMX'

## 安装 kubectl
# 安装 kubectl
brew install kubernetes-cli
# 查看安装的 kubectl 版本
kubectl version --client

# 启用 kubectl 的 shell 自动补全功能
# fish shell
git clone https://github.com/evanlucas/fish-kubectl-completions
ln -s -f fish-kubectl-completions/kubectl.fish ~/.config/fish/completions/kubectl.fish

# 使用 Homebrew 安装 Minikube
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
# 由于国内无法直接连接 k8s.gcr.io,推荐使用阿里云镜像仓库,
# 在 minikube start 中添加 --image-repository 参数。
# 由于要拉取镜像,所以等待时间可能会比较长
minikube start --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers

# 获取集群状态
minikube status

# 查看集群信息
kubectl cluster-info

# 列出集群中运行的节点
kubectl get nodes

# 查看节点的详细信息
kubectl describe node <node-name>

# 登录集群 VM
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 .

# 运行镜像,打开浏览器后,返回 http://localhost:8080
docker run --name kubia-test -p 8080:8080 yuanmomo/kubia:latest

# 登录 Docker 账号
docker login -u xxx -p xxx

# push 镜像
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
# 一定要将 yuanmomo/kubia:latest 镜像推送到远程仓库
kubectl run kubia --image=yuanmomo/kubia:latest --port=8080 --generator=run-pod/v1

# 列出 pod
# 主要看 STSTUS 列,如果显示 Running,表示启动成功。
kubectl get pods

1.1.1.4. 访问 Web 服务

1.1.1.4.1. 创建服务对象

创建 LoadBalancer 服务:

1
2
3
4
5
# rc 是 replicationcontroller 的缩写
# po => pods
# svc => service
» 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
# 列出当前 ReplicationController 的副本数
» kubectl get rc
NAME DESIRED CURRENT READY AGE
kubia 1 1 1 13m

# 增加期望的副本数到 3
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 服务地址,会发现请求会随机的落到三个容器中。

random-pods-request

1.1.1.6. 访问 Minikube 的 dashboard

1
minikube dashboard
Just for my love !!