作者:北京元鼎时代科技股份有限公司 张应罗!
前言:三个节点的节点配置相关信息以及各个节点的Docker安装,见我的前两篇博客!下面开始正文。
K8S官方安装文档建议每个节点在安装前都需要禁用SELINUX
Note:
Node1节点SELINUX已禁用!
cat
< /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kube*
EOF
setenforce
0
这里由于我们没法用京东云主机,因此我直接配置阿里的镜像安装K8S
cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
增加了kubernetes.repo
#yum install -y kubelet kubeadm kubectl ipvsadm
#yum install -y kubelet kubeadm kubectl --disableexcludes
=kubernetes (官方文档命令)
安装完成!
重启K8S相关服务
#systemctl enable kubelet && systemctl start kubelet
A:分别配置三台主机hosts文件解析
B:关闭系统swap分区(三节点全部操作)
# 临时关闭swap
# 永久关闭 注释/etc/fstab文件里swap相关的行
swapoff -a
这里解析下为什么要关闭系统的swap分区:
kubernetes的想法是将实例紧密包装到尽可能接近100%。 所有的部署应该与CPU /内存限制固定在一起。 所以如果调度程序发送一个pod到一台机器,它不应该使用交换。 设计者不想交换,因为它会减慢速度。所以关闭swap主要是为了性能考虑。当然为了一些节省资源的场景,比如运行容器数量较多,可添加kubelet参数 --fail-swap-on=false来解决。
C:开启forward(三节点全部操作)
Docker从1.13版本开始调整了默认的防火墙规则
禁用了iptables filter表中FOWARD链
这样会引起Kubernetes集群中跨Node的Pod无法通信
# iptables -P FORWARD ACCEPT
D:配置相关转发参数(三节点全部操作)
在centos/redhat上可能会出现路由失败,因此需要做如下配置:
cat < /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness=0
EOF
sysctl --system
E:配置pause镜像/cgroup等(三节点全部操作)
# 配置kubelet使用国内pause镜像
# 配置kubelet的cgroups
# 获取docker的cgroups
DOCKER_CGROUPS=$(docker info | grep 'Cgroup' | cut -d' ' -f3)
echo $DOCKER_CGROUPS
cat >/etc/sysconfig/kubelet<
kubeadm init --kubernetes-version=v1.11.0 --pod-network-cidr=10.244.0.0/16
报错了,截图如下:
应该是无法直接从google拉去相关容器镜像,但是我应该配置过阿里的K8S镜像源了为啥还报错呢?(这里是个巨大的坑,最主要的原因是没有科学上网,后面自己做实验的小伙伴,要不想办法让你的环境科学上网,要不就自己把需要的镜像全部pull到本地节点,然后按照他们的要求用docker tag命令修改成他要求的格式image,后面我会继续遇到此类问题,请继续往下围观。。。)
解决办法:新建一个执行脚本,先把镜像下载下来后改名然后再做kubeadm初始化工作(脚本内容和脚本执行后的结果如下图,从脚本内容看,这个脚本也是网上的兄弟分享出来的,这位兄弟写的脚本也是从自己的私有镜像仓库里拉到本地节点,然后修改image的名称)
以上运行后发现还是有三个包无法下载下来,但是比第一次要少,第一次一共有7个image无法pull,前面有截图大家可以对比一下
备注:脚本内容有问题,最后三个包(k8s.gcr.io/pause:3.1; k8s.gcr.io/etcd-amd64:3.2.18 ;k8s.gcr.io/coredns:1.1.3)在脚本里的版本不一致,更换脚本内容如下:
重新执行脚本,截图如下:
再次开始初始化,前面是K8S版本号,后面是你POD 网络的 IP 段(为啥非得是这个网段?flannel网络默认?-确实是flannel网络默认的pod网络地址段)
初始化成功!
最下面的这行kubeadm join
,就是用来让别的node加入集群的,可以看出非常方便。我们要保存好这一行东西,这是我们之后让node加入集群的凭据,一会儿会用到。
kubeadm join 192.168.0.12:6443 --token m9t7wo.ut3wimfioutlvdmw --discovery-token-ca-cert-hash sha256:8d11ddabde6a0b597bae9e0df488b14101486c7406797b10716e3fd053a31920
这个时候,我们还不能通过kubectl
来控制集群,要让kubectl
可用(配置 kubectl
认证信息),我们需要做:
# 对于非root用户
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 对于root用户
$ export KUBECONFIG=/etc/kubernetes/admin.conf
# 也可以直接放到~/.bash_profile(推荐用这个命令)
$ echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
network addon必须在任何app部署之前安装好。同样的,kube-dns
也会在network addon安装好之后才启动。kubeadm
只支持CNI-based networks(不支持kubenet
)。
比较常见的network addon有:Calico
, Canal
, Flannel
, Kube-router
, Romana
, Weave Net
等。这里我们使用Flannel
。
# 下载配置
mkdir flannel && cd flannel
wget https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml
# 修改配置
# 此处的ip配置要与上面kubeadm的pod-network一致
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
# 修改镜像
image: registry.cn-shanghai.aliyuncs.com/gcr-k8s/flannel:v0.10.0-amd64
# 如果Node有多个网卡的话,参考flannel issues 39701,
# https://github.com/kubernetes/kubernetes/issues/39701
# 目前需要在kube-flannel.yml中使用--iface参数指定集群主机内网网卡的名称,
# 否则可能会出现dns无法解析。容器无法通信的情况,需要将kube-flannel.yml下载到本地,
# flanneld启动参数加上--iface=
containers:
- name: kube-flannel
image: registry.cn-shanghai.aliyuncs.com/gcr-k8s/flannel:v0.10.0-amd64
command:
- /opt/bin/flanneld
args:
- --ip-masq
- --kube-subnet-mgr
- --iface=eth1
# 启动
kubectl apply -f kube-flannel.yml
# 查看
kubectl get pods --namespace kube-system
kubectl get svc --namespace kube-system
创建flannel目录,并进入目录,利用wget下载flannelv0.10.0版本的yml文件,如下图:
执行kubectl apply -f kube-flannel.yml
# 查看
kubectl get pods --namespace kube-system
kubectl get svc --namespace kube-system
在其他两个节点输入我们之前在做kubeadm初始化的时候命令行给出的命令:
小技巧
忘记初始master节点时的node节点加入集群命令怎么办(在master节点输入)
# 简单方法
kubeadm token create --print-join-command
# 第二种方法
token=$(kubeadm token generate)
kubeadm token create $token --print-join-command --ttl=0
查看节点状态
kubectl get node
接下来看我在安装flannel组件的时候踩过的坑,以及如何解决!!!
安装完flannel网络组件查看状态的时候发现有错误出现:导致我刚开始没发现,当在创建pod的时候,一直提示containercreating,容器创建中,始终无法创建成功!!!
进一步看看报错信息发现:
解决方案:
针对缺少k8s.gcr.io/kube-proxy-amd64:V1.11.0的解决方案思路是,从阿里云镜像服务市场内pull了一个V1.11.1的包,然后重新tag!
备注:第二行命令里面 k8s前面的“tag”多余了。
结果发现还是报错,原因是我实在找不到v1.11.0的包,用pull了一个v1.11.1d的image,最后无奈就又用tag命令把版本更换成v1.11.0后,再次
Kubectl describe pod –namespace=kube-system发现之前报错的两个节点的proxy服务正常!
但是flannel的组件在node2和node3仍然报错,之前我们查看过详细报错说是flannel的image已经在节点存在,于是我们就到node2和node3上分别重启了kubelet服务 systemctl restart kubelet后,全部正常:
至此 3节点的K8S集群+flannel安装完成。
最后给大家分享一个学习k8s的视频网站,马哥的教程,我看了非常深入也成体系,讲解由浅入深,我觉得非常棒,解决了我很多在普通的文章里看不到的疑问!!!大家可以扫码学习,价格也不算贵!