基于 Kubernetes 1.12.1
之前折腾K8s的时候一直使用的是在 Ubuntu 虚拟机上起的 minikube,最近想在我的笔记本上使用多台虚拟机部署一套 Kubernetes 集群。正好今年上半年 Ubuntu 发布了新的LTS版本 – 18.04 (Bionic Beaver),于是便有了这篇文章,在 Ubuntu 18.04 上折腾安装部署 K8s 集群。
0x00 前置条件
- Ubuntu 18.04 虚拟机
- Shadowsocks 科学上网
我的笔记本是Win10,通过 HyperV 安装了 3 台虚拟机,并对虚拟机进行如下规划:
主机名 | ip | 角色 | 配置 | OS |
---|---|---|---|---|
k8s-master001 | 192.168.99.103 | master | 2C2G | Ubuntu 18.04 |
k8s-node001 | 192.168.99.104 | node | 1C2G | Ubuntu 18.04 |
k8s-node002 | 192.168.99.105 | node | 1C2G | Ubuntu 18.04 |
0x01 环境准备(所有虚拟机)
Ubuntu虚拟机配置apt源
国内配置apt源为阿里云的源下载速度会快一些,把 /etc/apt/sources.list
里面的内容替换成下面的内容即可
1 | deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse |
更新
1 | apt-get update |
配置 Shadowsocks 客户端进行科学上网
1. 安装 Shadowsocks 客户端
1 | apt-get install python-pip |
2. 创建 Shadowsocks 配置文件
创建一个 /etc/shadowsocks.json
文件,格式如下
1 | { |
3. 启动 Shadowsocks
1 | /usr/local/bin/sslocal -c /etc/shadowsocks.json -d start |
4. 安裝 privoxy
为了在终端中使用代理,还需要安装配置 privoxy (也可以选择 proxychains)
1 | apt-get install privoxy -y |
5. 配置 privoxy
安装完成后编辑 /etc/privoxy/config
,搜索关键字 forward-socks5t
,取消下面这一行的注释:
1 | forward-socks5t / 127.0.0.1:1080 . |
这里 1080 对应着上面 Shadowsocks 配置文件中的“端口号”。
6. 启动 privoxy
1 | systemctl start privoxy |
7. 配置 proxy
编辑 ~/.profile
,并在文件末尾添加如下内容:
1 | export http_proxy=http://127.0.0.1:8118 |
执行 source ~/.profile
使之生效。
测试proxy是否可用
1 | curl www.google.com |
关闭swap
编辑/etc/fstab
文件,注释掉引用swap的行,保存并重启后输入sudo swapoff -a
即可。参考Kubelet/Kubernetes should work with Swap Enabled
0x02 安装Docker(所有虚拟机)
安装
参考 安装Docker-阿里云
1 | # step 1: 安装必要的一些系统工具 |
配置阿里云镜像加速
参考 Docker 镜像加速器
配置加速地址,并重启 Docker
1 | sudo mkdir -p /etc/docker |
配置 Docker 的 proxy
Kubernetes 的一些 docker
镜像是需要借助梯子才能拉取到的,为此需要为 Docker
配置 Proxy。
参考 https://docs.docker.com/config/daemon/systemd/#httphttps-proxy
配置文件 /etc/systemd/system/docker.service.d/http-proxy.conf
内容如下:
1 | [Service] |
注意:这里的NO_PROXY需要上面配置的镜像加速地址添加进去
重启 Docker
1 | sudo systemctl daemon-reload |
0x03 安装Kubernetes(所有虚拟机)
1 | apt-get update && apt-get install -y apt-transport-https curl |
注意: 目前kubernetes还没有 Ubuntu18.04 的编好的版本,用的 16.04 xenial 的二进制文件
0x04 配置master节点
使用kubeadm init初始化master节点
参考 https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/
1 | kubeadm init --apiserver-advertise-address 192.168.99.103 --pod-network-cidr=10.244.0.0/16 |
init 常用主要参数:
- –kubernetes-version: 指定Kubenetes版本,如果不指定该参数,会从google网站下载最新的版本信息。
- –pod-network-cidr: 指定pod网络的IP地址范围,它的值取决于你在下一步选择的哪个网络网络插件,比如我在本文中使用的是 flannel 网络,需要指定为10.244.0.0/16。
- –apiserver-advertise-address: 指定master服务发布的Ip地址,如果不指定,则会自动检测网络接口,通常是内网IP。
kubeadm init 输出的token用于master和加入节点间的身份认证,token是机密的,需要保证它的安全,因为拥有此标记的人都可以随意向集群中添加节点。
安装网络插件
安装一个网络插件是必须的,因为你的pods之间需要彼此通信。
网络部署必须是优先于任何应用的部署,详细的网络列表可参考插件页面。
本文使用的是flannel 网络,安装如下:
1 | kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml |
插件安装完成后,可以通过检查coredns pod
的运行状态来判断网络插件是否正常运行。等待coredns pod
的状态变成Running,就可以继续添加从节点了。
0x05 添加从节点
在从节点上按照前面的步骤按照好docker和kubeadm后,就可以添加从节点到主节点上了
1 | kubeadm join 192.168.99.103:6443 --token k3c625.qjgzf8bdc8naufzt --discovery-token-ca-cert-hash sha256:3edad91bb59c6657e4b3dea984e9f484c56032b0d81d504e7e6e3615072f334b |
过一会儿就可以通过 kubectl get nodes
命令在主节点上查询到从节点了
1 | root@k8s-master001:~/k8s# kubectl get nodes |
0x06 安装 Dashboard 插件
dashboard 支持两种模式:
https
必须提供证书,参考 官方部署文档
kubectl apply -f https://github.com/kubernetes/dashboard/blob/master/src/deploy/recommended/kubernetes-dashboard.yaml
http
kubectl apply -f https://github.com/kubernetes/dashboard/blob/master/src/deploy/alternative/kubernetes-dashboard.yaml
我这里先把配置文件下到本地:
1 | wget https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/alternative/kubernetes-dashboard.yaml |
并在配置文件最后添加 type: NodePort
以实现外网访问
1 | # ------------------- Dashboard Service ------------------- # |
执行 kubectl create -f kubernetes-dashboard.yaml
安装。
为了简单,我这里直接为 Dashboard 赋予 Admin 的权限,参考https://github.com/kubernetes/dashboard/wiki/Access-control#admin-privileges
新增 dashboard-admin.yaml
并使用 kubectl create -f dashboard-admin.yaml
进行部署,文件内容如下:
1 | apiVersion: rbac.authorization.k8s.io/v1beta1 |
接下来就可以直接通过 nodeIp:port 访问 Dashboard 了。暴露的外部端口可以通过 kubectl get svc --namespace=kube-system
查看
1 | root@k8s-master001:~/k8s# kubectl get svc --namespace=kube-system |
0x07 卸载集群
想要撤销kubeadm做的事,首先要排除节点,并确保在关闭节点之前要清空节点。
在主节点上运行:
1 | kubectl drain <node name> --delete-local-data --force --ignore-daemonsets |
然后在需要移除的节点上,重置kubeadm的安装状态:
1 | kubeadm reset |