Kubernetes部署(v1.5.3)

由于K8S更新较快, 不建议使用该版本部署, 大家可以使用1.6.1或更高版本

最近k8s很火, k8skubernetes, 是google的一套集群解决方案, 目前自己已经在阿里云上成功部署, 这个过程有数不尽的坑, 其中大部分是因为国内的墙导致, 所以我将部署过程中需要的docker镜像都上传到阿里容器服务, 将一些配置文件上传到我的站点, 同时也自己制作了一个k8s的yum源供大家使用, 减少因为墙的问题导致的坑. 当然如果大家有条件的话, 可以在国外服务器上尝试.

这是以CentOS7为例

一. Master安装

1. 安装docker
# 下载安装
yum install docker -y
# 加入开机启动并启动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 10.244.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/1.5.3/kube-flannel.yml

其中文件里的Network配置要和上面初始化参数--pod-network-cidr指定的网段一致, 这一点非常重要, 否则后续通讯会出现问题, 这里我都指定的是 10.244.0.0/16

7. 可视化后台
# 执行文件 
kubectl create -f http://res.yinnote.com/kubernetes/1.5.3/kubernetes-dashboard.yaml

这个文件我修改了镜像地址, 同时我也指定对外的端口为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

kubeadm相关文章

->Kubernetes部署(v1.5.x)
Kubernetes部署(v1.6.x)

推荐阅读更多精彩内容