实验目的:
之前安装了minikube,本来的目的就是了解了解kubernetes的命令,算是简单入门。其实安装完成后,也没怎么用过,真正想深入学习,还是得安装集群。
于是乎,说干就干了。安装的过程还是有些麻烦,前前后后安装过两次,耗费一天时间,还是觉得自己的功力不够深厚啊。
实验准备:
1)三台CentOS 7.7主机(本实验使用的是VirtualBox虚拟机)
主机名 | 主机IP地址 | 备注 |
K8SMaster | 192.168.1.4 | K8S控制节点,需安装Docker,kubelet,kubeadm,kubectl,以及calico网络 |
K8SNode1 | 192.168.1.3 | K8S集群计算节点,需安装Docker,kubelet,kubeadm |
K8SNode2 | 192.168.1.5 | K8S集群计算节点,需安装Docker,kubelet,kubeadm |
2)Docker 18.03.1
3)Kubernetes组件:kubelet,kubeadm,kubectl
实验过程:
步骤一:安装docker,首先下载yun源文件,然后安装。安装成功后启动docker,同时设置docker和kubelet开机启动。
Docker安装可以参考之前发的安装帖子。
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum list docker-ce --showduplicates | sort -r
yum install docker-ce-18.03.1.ce
systemctl enable docker && systemctl start docker //设置开机启动
为了docker下载镜像加速,同样要新建并配置一个deamon.json文件。
vi /etc/docker/daemon.json
复制如下代码到此文件中
{
"registry-mirrors": ["https://zfzbet67.mirror.aliyuncs.com"]
}
步骤二:安装kubernetes。上官网,https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
首先配置yum源,由于官网的yum仓库地址是Google的,考虑到国内访问速度慢,所以换成了阿里云的地址。使用如下命令新建kubernetes.repo文件
vi /etc/yum.repos.d/kubernetes.repo
然后将相关信息写入到该文件中,保存退出。(先按Esc键切换到非编辑模式,然后按Shift+Q键,在最下面一行提示符冒号后,输入wq,回车退出)
[kubernetes]
name=Kubernetes Repository
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
使用yum命令安装kubernetes相关工具。
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable kubelet && systemctl start kubelet //设置开机启动
步骤三:配置内核参数
1)将 SELinux 设置为 permissive 模式(相当于将其禁用)
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
2)关闭swap,并注释swap分区
swapoff -a
vi /etc/fstab
3)配置内核参数,将桥接的IPv4流量传递到iptables的链
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
步骤四:初始化K8S集群,使用kubeadm init命令,指定K8S版本号,apiserver IP地址(即master本机IP,我做实验的本机ip为192.168.1.4),后面的镜像仓库参数以及service和pod的网络配置,均是参考了kubernetes中文社区的帖子(https://www.kubernetes.org.cn/7189.html )
kubeadm init --kubernetes-version=1.19.0 \
--apiserver-advertise-address=192.168.1.4 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.10.0.0/16 --pod-network-cidr=10.122.0.0/16
初始化成功后,会输出successful提示信息,同时要重点记录successful下面的信息。
根据提示,如果要启动集群,需要运行以下三行命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
查看node状态,会显示NotReady,因为目前还缺少网络pod。
kubectl get node
kubectl get pod --all-namespaces
步骤五:安装calico网络
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
如果没有问题,会输出一堆created信息
查看pod和node信息,如果是Running和Ready,说明运行正常
kubectl get pod --all-namespaces
kubectl get node
步骤六:安装Node节点,重复操作步骤一至步骤三,只有步骤二稍有区别,Node节点上不需要安装kubectl命令行工具,因为操作K8S集群肯定是通过master节点的。
注意:这里的kubeadm join命令信息,是之前在master节点上kubeadm init完成后输出的信息,最重要的就是这个token,一般有效期是1天,过期了需要重新生成。
kubeadm join --token 8yocd2.v3eiy8oazz0eprz1 192.168.1.4:6443 \
--discovery-token-ca-cert-hash sha256:011c85790fea2f64aeca911f68fb0ffc121708b90eaafb77db2fc001717626d9
然后回到master上查看node,会看到已添加的Node节点信息
如果在master上执行kubeadm init时没有记录下kubeadm join……那一长串的Node加入命令的话,可以使用如下命令找到token名称和sha256密钥。
kubeadm token list //获取token名称
//获取sha256密钥
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \ openssl dgst -sha256 -hex | sed 's/^.* //'
问题总结
1)如果使用kubeadm join无法成功添加到集群,使用kubeadm reset命令重置
2)在安装master和nodes之前,需修改主机名,最好规划IP地址,否则在后续join时会发生一些冲突
3)如果提示execution phase preflight: couldn't validate the identity of the API Server这样的错误,有两种情况:一是token可能失效了,使用kubeadm token list 查看有效的token信息,如果是空或者失效,需要重新生成token,使用kubeadm token create;二是防火墙或者SElinux没有关闭,注意检查。