最近k8s很火, k8s即kubernetes, 是google的一套集群解决方案, 目前自己已经在阿里云上成功部署, 这个过程有数不尽的坑, 其中大部分是因为国内的墙导致, 所以我将部署过程中需要的docker镜像都上传到阿里容器服务, 将一些配置文件上传到我的站点, 同时也自己制作了一个k8s的yum源供大家使用, 减少因为墙的问题导致的坑. 当然如果大家有条件的话, 可以在国外服务器上尝试.
这是以CentOS7为例
一. Master安装
1. 安装docker
# 下载安装
yum install docker
# 加入开机启动并启动docker
systemctl enable docker && systemctl start docker
建议下载
1.12版本, 最新1.13可能会出现dns问题, 不知后续版本是否修复
2. 配置加速器
# 输入内容
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://x2j0t6lh.mirror.aliyuncs.com"]
}
EOF
# 保存配置文件, 并重启服务
systemctl daemon-reload && systemctl restart docker
这个加速器是我阿里云容器服务的, 大家也可以自己配置自己的地址
3. 安装kubernete相关
# 添加 yum 源 (这个k8s yum源是我个人的, 长期维护, 注意一定要指定版本安装, 否则会安装到最新版本, 会出现不兼容现象)
tee /etc/yum.repos.d/magina-k8s.repo << EOF
[magina-k8s]
name=Magina K8s Repository
baseurl=https://cdn.yinnote.com/centos7/magina-k8s
enabled=1
gpgcheck=0
gpgkey=https://cdn.yinnote.com/keys/rpm.public.key
EOF
# 刷新cache
yum makecache
# 安装 (同时会安装依赖socat和kubernetes-cni)
yum install -y kubelet-1.5.3 kubectl-1.5.3 kubeadm-1.6.0
# 加入开机启动并启动kubelet (这里要先启动, 会报错, 但是也要启动)
systemctl enable kubelet && systemctl start kubelet
这里也可以自己在
github下载kubernetes源码, 编译出rpm安装包, 但记住, 编译源码需要访问google服务器, 所以你最好在境外服务器编译, 或者你自己有梯子
4. 下载相关镜像
# 创建镜像下载脚本
cd /opt
vi k8s-docker-images.sh
#############################################
# 添加需要的镜像
images=(
pause-amd64:3.0
kube-proxy-amd64:v1.5.3
kube-scheduler-amd64:v1.5.3
kube-controller-manager-amd64:v1.5.3
kube-apiserver-amd64:v1.5.3
etcd-amd64:3.0.14-kubeadm
kube-discovery-amd64:1.0
kubedns-amd64:1.9
kube-dnsmasq-amd64:1.4
exechealthz-amd64:1.2
dnsmasq-metrics-amd64:1.0
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/magina-k8s/$imageName
docker tag registry.cn-hangzhou.aliyuncs.com/magina-k8s/$imageName gcr.io/google_containers/$imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/magina-k8s/$imageName
done
#############################################
# 执行脚本
bash k8s-docker-images.sh
kubeadm初始化时会需要这些镜像, 原本的镜像国内无法下载, 所以我构建了这些镜像并托管到阿里云容器服务, 方便大家使用
5. 集群初始化
# 如果没有提前下载好镜像, 又是国内服务器, 那么这个过程会卡住
kubeadm init --api-advertise-addresses xxx.xxx.xx.xx --use-kubernetes-version v1.5.3 --pod-network-cidr 172.16.0.0/16
参数
--api-advertise-addresses一定要指定阿里云内网地址, 否则在后续网络配置时会出现问题, 另外这里面有些参数和1.6+版本不一样, 注意区别
而这一步非常重要, 当执行成功后, 会有提示, 让你记住一条命令, 这个一定要记住, 因为它是
Node节点加入的凭证, 类似kubeadm join --token=9d591c.9000a98b9e475249 10.168.186.185
如果初始化失败, 或者意外终端, 需要先重置, 再初始化, 重置的命令如下
kubeadm reset
默认情况下, Master节点是不会调度服务的, 也就是我们如果启动服务, 不会在Master节点创建的, 但有时我们只有一台机器, 或者做测试, 那么我们希望Master节点也能够调度服务, 可以执行
kubectl taint nodes --all dedicated-
6. 添加 flannel 网络
# 必须添加了这个网络, kube-dns 才能运行成功
kubectl create -f http://res.yinnote.com/kubernetes/network/kube-flannel.yml
我修改了这个
yml文件里面镜像地址及namespace, 并将文件上传到我的站点. 因为原来的镜像地址国内无法下载, 所以我自己在阿里云的容器服务构建了一个供大家使用.
其中文件里的
Network配置要和上面初始化参数--pod-network-cidr指定的网段一致, 这一点非常重要, 否则后续通讯会出现问题, 这里我都指定的是172.16.0.0/16
7. 可视化后台
# 执行文件
kubectl create -f http://res.yinnote.com/kubernetes/base/kubernetes-dashboard.yml
这个文件我也修改了镜像地址, 同时我也指定对外的端口为
31234
测试是否可访问到后台
http://你的服务器ip或域名:31234

二. Node节点加入
1. 安装docker
2. 配置加速器
3. 安装kubernete相关
方法同上
4. 下载相关镜像
# 创建镜像下载脚本
cd /opt
vi k8s-docker-images.sh
#############################################
# 添加需要的镜像
images=(
pause-amd64:3.0
kube-proxy-amd64:v1.5.3
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/magina-k8s/$imageName
docker tag registry.cn-hangzhou.aliyuncs.com/magina-k8s/$imageName gcr.io/google_containers/$imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/magina-k8s/$imageName
done
#############################################
# 执行脚本
bash k8s-docker-images.sh
Node节点需要k8s相关的镜像不多
5. 加入Master
前面有提到, 在master节点执行kubeadm init ...成功后, 会提示
kubeadm join --token=9d591c.9000a98b9e475249 10.168.186.185
一定要记住前面的这个结果提示, 因为目前我还没找到怎么重现这个
token值, 大家记住自己的 (1.6版本可以查看)
此时只需要执行这个提示命令即可, 稍后会有加入成功的提示. 如果提示失败, 和master处理方式一样
kubeadm reset
6. 验证
回到master服务器, 执行
kubectl get no

即可以看到当前的节点
node情况, 如果想要查看pod运行情况, 可以执行
kubectl get po -n kube-system -o wide

READY -- pod 运行个数
STATUS -- pod运行状态
RESTARTS -- pod启动次数
AGE -- pod启动时长
IP -- pod虚拟ip
NODE -- pod运行在哪个容器上
同样的, 我们也可以通过node服务器的ip或域名访问到pod的服务, 如dashboard后台
http://node服务器ip或域名:31234
