Kubernetes部署(v1.6.1)

K8S v1.6.x版本有一个很大的升级, 支持了多用户, 多集群, 具体情况, 大家可以看官方发布的详细. 在升级1.6的过程中, 还是遇到一些坑的, 不过好在前辈们比较积极, 大部分问题都有人分享出来

一. Master安装

1. Docker安装

目前官方仍然希望使用v1.12版本, v1.10v1.11官方测试也可以使用, v1.13官方明确说明, 没有测试过, 所以大家最好也不要使用. 我在部署k8s v1.5.3测试过Docker v1.13, 发现通过NodePort方式暴露端口会出问题, 外部无法访问Pod

  • yum安装
yum install docker -y
# 加入开机启动并启动docker
systemctl enable docker && systemctl start docker
  • 配置加速器
# 输入内容
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://x2j0t6lh.mirror.aliyuncs.com"]
}
EOF
# 保存配置文件, 并重启服务
systemctl daemon-reload && systemctl restart docker

这个加速器是我阿里云容器服务的, 大家也可以自己配置自己的地址

2. K8S安装
# 添加 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.6.1 kubectl-1.6.1 kubeadm-1.6.1

# 加入开机启动并启动kubelet (这里要先启动, 会报错, 但是也要启动)
systemctl enable kubelet && systemctl start kubelet
3. 下载镜像
# 创建镜像下载脚本
cd /opt
vi k8s-docker-images.sh

#############################################
# 添加需要的镜像
images=(
    pause-amd64:3.0
    kube-proxy-amd64:v1.6.1
    kube-scheduler-amd64:v1.6.1
    kube-controller-manager-amd64:v1.6.1
    kube-apiserver-amd64:v1.6.1
    etcd-amd64:3.0.17

    k8s-dns-sidecar-amd64:1.14.1
    k8s-dns-kube-dns-amd64:1.14.1
    k8s-dns-dnsmasq-nanny-amd64:1.14.1  
)

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

这些镜像我已经托管到阿里的镜像仓库了, 方便大家下载. 另外大家可以发现关于dns镜像这块发生了很大的变化, 基本取了新的名字, 而kube-discovery-amd64这个镜像也去掉了

4. 启动K8S

这次kubeadm终于由alpha版本升级到beta了, 不过里面的参数也做了相应的调整, 所以如果按照v1.5.3的方式启动, 会出现参数错误.

# 初始化集群
kubeadm init --kubernetes-version v1.6.1 --pod-network-cidr 10.244.0.0/16 --apiserver-advertise-address 192.168.1.1

大家可以比较参数名称的变化, 当我们启动时, 会出现错误. 他会检测系统网桥的配置, 这个时候我们需要进行简单的修改

# 创建文件
vi /etc/sysctl.d/k8s.conf

# 添加如下内容
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

# 使配置生效
sysctl -p /etc/sysctl.d/k8s.conf

修改好再启动, 如果发现配置文件已经存在可以执行重置

kubeadm reset

当继续初始化时, 会发现卡死不动, 可以通过系统日志查看错误

journalctl -f -u kubelet.server

failed to create kubelet: misconfiguration: kubelet cgroup driver: "cgroupfs" is different from docker cgroup driver: "systemd"

这个是K8S v1.6.x的一个变化, 文件驱动默认由systemd改成cgroupfs, 而我们安装的docker使用的文件驱动是systemd, 造成不一致, 导致镜像无法启动

# 查看docker的文件驱动
docker info

现在有两种方式, 一种是修改docker, 另一种是修改kubelet, 这里我建议大家选择第二种, 修改kubelet的文件驱动, 因为我试着修改docker, 发现镜像无法拉取, 导致初始化不能成功

5. 修改kubelet的文件驱动
# 进入kubelet启动配置文件
cd /etc/systemd/system/kubelet.service.d/
vi 10-kubeadm.conf

添加如下内容--cgroup-driver=systemd

# 保存配置, 重启
systemctl daemon-reload
systemctl restart kubelet

之后再重新初始化, 应该就能成功了

改进token问题

之前的版本, 当我们初始化成功之后, 会发现token不会保留, 如果一旦没有记录下来, 其他节点就没法加入了, 这里添加了kubeadm token命令

kubeadm token list

默认情况下, master节点是不会调度pod, 也就是说, 只有一台主机的情况下, 我们无法启动pod, 但有的时候我们的确只有一台机器, 这个时候可以执行命令, 允许master调度pod(这个命令和1.5.x版本不一样)

kubectl taint nodes --all node-role.kubernetes.io/master-

kubectl 命令

这个命令是我们经常使用的, 几乎所有的k8s相关操作都需要, 但当我们集群安装好后, 发现这个命令会报错, 这里我直接给出解决方案, 具体细节, 大家去查

# 最直接的方法是带上参数 --kubeconfig
kubectl --kubeconfig=/etc/kubernetes/admin.conf get nodes

# 如果不想每次都带上参数, 可以配置环境变量
vi /etc/profile
# 底部添加
export KUBECONFIG=/etc/kubernetes/admin.conf  
# 使之生效
source /etc/profile

之后, 便可以像以前一样使用了

6. 配置flannel网络插件
kubectl apply -f http://res.yinnote.com/kubernetes/1.6.1/kube-flannel-rbac.yml
kubectl apply -f http://res.yinnote.com/kubernetes/1.6.1/kube-flannel.yml

flannel版本是0.7.1, 我修改了镜像地址, 注意: flannel网络插件比以前多了一个授权文件rbac

最后, 部署成功大概是这样(忽略Jenkins镜像)

二. Node节点加入

1. Docker镜像
2. K8S安装

Master节点处理一样

3. 下载镜像

下载基础镜像

# 创建镜像下载脚本
cd /opt
vi k8s-docker-images.sh

#############################################
# 添加需要的镜像
images=(
    pause-amd64:3.0
    kube-proxy-amd64:v1.6.1
)

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
4. 修改kubelet的文件驱动

Master节点处理一样 (注意这个参数--cgroup-driver=systemd, 否则kubectl get no会看不到节点加入的)

5. 加入Master
kubeadm join --token=9d591c.9000a98b9e475249 10.168.186.185:6443

注意这个命令和v1.5.x版本的区别, 多了一个端口号

6. 验证

回到master服务器, 执行

kubectl get no

可以看到节点加入的情况, 如果想要查看pod运行情况, 可以执行

kubectl get po -n kube-system -o wide

kubeadm相关文章

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

推荐阅读更多精彩内容