K8S v1.6.x
版本有一个很大的升级, 支持了多用户, 多集群, 具体情况, 大家可以看官方发布的详细. 在升级1.6
的过程中, 还是遇到一些坑的, 不过好在前辈们比较积极, 大部分问题都有人分享出来
一. Master安装
1. Docker安装
目前官方仍然希望使用v1.12
版本, v1.10
和v1.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
网友评论