k8s集群安装----(一)
安装前提示,不要放C盘,不要放C盘,不要放C盘
1 kubeadm
kubeadm是官⽅社区推出的⼀个⽤于快速部署kuberneters集群的⼯具。
这个⼯具能通过两条指令完成⼀个kuberneters集群的部署
创建⼀个master节点
$ kuberneters init
将⼀个node节点加⼊到当前集群中
$ kubeadm join <Master节点的IP和端⼝>
上述步骤会在接下来的节点安装好有步骤,可以先按照下面的步骤去部署好节点。
2 前置要求
⼀台或多台机器,操作系统Centos7.x-86_x64
硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
集群中所有的机器之间⽹络互通
可以访问外⽹,需要拉取镜像
禁⽌Swap分区
3 部署步骤
- 在所有的节点上安装Docker和kubeadm
- 部署Kubernetes Master
- 部署容器⽹络插件
- 部署Kubernetes Node,将节点加⼊Kubernetes集群中
- 部署DashBoard web⻚⾯,可视化查看Kubernetes资源
4 环境准备
4.1 准备⼯作
我们可以使⽤vagrant快速创建三个虚拟机。虚拟机启动前先设置virtualbox的主机⽹络。现在全部统⼀为192.168.56.1,以后所有虚拟机都是56.x的ip地址。
在全局设定中,找到⼀个空间⽐较⼤的磁盘⽤⽤来存放镜像。
4.2 启动三个虚拟机
使⽤我们提供的vagrant⽂件,复制到⾮中⽂⽆空格⽬录下,运⾏vagrant up启动三个虚拟机。其实vagrant完全可以⼀键部署全部K8s集群
https://github.com/rootsongjc/kubernetes-vagrant-centos-cluster
http://github.com/davidkbainbridge/k8s-playground
下⾯是vagrantfile,使⽤它来创建三个虚拟机,分别为k8s-node1,k8s-node2和k8s-node3.
我们当初安装vagrant的目录下,把下面的配置文件放进去就会生成了三个节点。
Vagrant.configure("2") do |config|
(1..3).each do |i|
config.vm.define "node#{i}" do |node|
# 设置虚拟机的Box
node.vm.box = "centos/7"
# 设置虚拟机的主机名
node.vm.hostname="node#{i}"
# 设置虚拟机的IP
node.vm.network "private_network", ip: "192.168.56.#{199+i}",
netmask: "255.255.255.0"
# 设置主机与虚拟机的共享⽬录
# node.vm.synced_folder "~/Documents/vagrant/share",
"/home/vagrant/share"
# VirtaulBox相关配置
node.vm.provider "virtualbox" do |v|
# 设置虚拟机的名称
v.name = "node#{i}"
# 设置虚拟机的内存⼤⼩
v.memory = 4096
# 设置虚拟机的CPU个数
v.cpus = 4
end
end
end
end
进⼊到三个虚拟机,开启root的密码访问权限
Vagrant ssh xxx进⼊到系统后
su root 密码为vagrant
vi /etc/ssh/sshd_config
修改
PermitRootLogin yes
PasswordAuthentication yes
所有的虚拟机设为4核4G
重启sshd
systemctl restart sshd
远程连接node3连接不上
重启node3里的sshd服务:
关于在”⽹络地址转换”的连接⽅式下,三个节点的eth0,IP地址相同的问题。
问题描述:查看k8s-node1的路由表:
能够看到路由表中记录的是,通过端⼝eth0进⾏数据包的收发。
分别查看k8s-node1,k8s-node2和k8s-node3的eth0所绑定的IP地址,发现它们都是相同的,全都是10.0.2.15,这些地址是供kubernetes集群通信⽤的,区别于eth1上的IP地址,是通远程管理使⽤的。
原因分析:这是因为它们使⽤是端⼝转发规则,使⽤同⼀个地址,通过不同的端⼝来区分。但是这种端⼝转发规则在以后的使⽤中会产⽣很多不必要的问题,所以需要修改为NAT⽹络类型
解决⽅法:
选择三个节点,然后执⾏“管理”->“全局设定”->“⽹络”,添加⼀个NAT⽹络。
在关机的情况下,分别修改每台主机的网络连接类型,以及重新刷新MAC地址。
再次查看三个节点的IP
4.3 设置Linux环境
三个节点都执⾏
关闭防⽕墙
systemctl stop firewalld
systemctl disable firewalld
关闭seLinux
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0
#查看
cat /etc/selinux/config
关闭swap
swapoff -a #临时关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab #永久关闭
free -g #验证,swap必须为0
如果没有变成0的话就重启一下node节点
查看主机名
如果主机名不正确,可以通过“hostnamectl set-hostname :指定新的hostname”命令来进⾏修改。
没有配置前,节点是ping不通的
用ip addr查看对应的ip地址
10.0.2.15 node1
10.0.2.4 node2
10.0.2.5 node3
现在我们可以ping通了
K8s的有一大功能就是当某一个节点流量多的时候,他就会自动的拉取多个节点,进行水平扩容。
具体配置如下:
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
应⽤规则:
sysctl --system
应用成功
4.4 安装组件
所有节点安装docker、kubeadm、kubelet、kubectl
Kubenetes默认CRI(容器运⾏时)为Docker,因此先安装Docker。
(1)安装Docker
1、卸载之前的docker
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2、安装Docker -CE
$ sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum -y install docker-ce docker-ce-cli containerd.io
上述三个命令执行情况如下:
上述步骤Docker就安装好了。
3、配置镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://azk2srw0.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
上述四条命令直接复制粘贴 执行即可。
4、启动Docker && 设置docker开机启动
systemctl enable docker
基础环境准备好,可以给三个虚拟机备份⼀下;
(2)添加阿⾥与Yum源
cat <<EOF > /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
更多详情⻅: https://developer.aliyun.com/mirror/kubernetes
(3)安装其他组件
安装kubeadm,kubelet、kubectl
yum list|grep kube
安装
yum install -y kubelet-1.17.3 kubeadm-1.17.3 kubectl-1.17.3
如果这里安装发生错误的话如下:
我试了上面只改那一个不行,得把两个校验值都改为0
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
开机启动
systemctl enable kubelet && systemctl start kubelet
查看kubelet的状态:
systemctl status kubelet
现在还是一个faild的状态,我们还没有装master和node节点
查看kubelet版本:
kubelet --version
4.5 部署k8s-master
(1)master节点初始化
master 初始化比较慢,所以这里从阿里云去下载
各个images的 意思
第一个,暴露api命令的一个服务,接受命令,跟其他客户端进行交互的一个命令
第二个 网络代理
第三个 管理controller的
第四个是调度任务的
第五个是 用来容器的发现,对于服务伸缩经常变动的节点进行管理。
第六个是 键值对的数据库,
第七个是 k8s 进行容器隔离的一个沙箱的机制
在Master节点上,创建并执⾏master_images.sh
#!/bin/bash
images=(
kube-apiserver:v1.17.3
kube-proxy:v1.17.3
kube-controller-manager:v1.17.3
kube-scheduler:v1.17.3
coredns:1.6.5
etcd:3.4.3-0
pause:3.1
)
for imageName in ${
images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
# docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
k8s.gcr.io/$imageName
done
在node节点下创建k8s目录
拷贝进去以后保存这个脚本文件,然后执行它
执行的时候发现没有权限
提升一下权限。
chmod 777 ./master_images.sh
再次执行,可以看到执行成功了
到这里的时候可以看到已经下载完成了。
使用docker命令可以看到,我们的镜像已经全部下载成功了。
初始化kubeadm
先查看一下网卡的地址
下面初始化的地址要和上面查看的保持一致。
kubeadm init \
--apiserver-advertise-address=10.0.2.15 \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version v1.17.3 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16
执行成功
注:
–apiserver-advertise-address= :这⾥的IP地址是master主机的地址,为上⾯的eth0⽹卡的地址;
执⾏结果:
执行结果(同上面的执行成功的那个,这是一个比较全的执行成功的显示界面)
由于默认拉取镜像地址k8s.cr.io国内⽆法访问,这⾥指定阿⾥云仓库地址。可以⼿动按照我们的images.sh先拉取镜像。
地址变为:registry.aliyuncs.com/googole_containers也可以。
科普:⽆类别域间路由(Classless Inter-Domain Routing 、CIDR)是⼀个⽤于给⽤户分配IP地址以及在互联⽹上有效第路由IP数据包的对IP地址进⾏归类的⽅法。
拉取可能失败,需要下载镜像。
运⾏完成提前复制:加⼊集群的令牌。就是下面这一串需要提前保存好
kubeadm join 10.0.2.15:6443 --token l1wsvh.13x01yyb7y6h12mg \
--discovery-token-ca-cert-hash sha256:25efa6b0b9a981733fecc0e2a169538d08bc29d9b530e746ae20f7a690dff3bb
(2)测试Kubectl
主节点上执⾏
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
详细部署⽂档:https://kubernetes.io/docs/concepts/cluster-administration/addons/
$ kubectl get nodes #获取所有节点
⽬前Master状态为notready。等待⽹络加⼊完成即可。
$ journalctl -u kubelet #查看kubelet⽇志
4.6 安装POD⽹络插件(CNI)
在master节点上执⾏按照POD⽹络插件
kubectl apply -f \
https://raw.githubusercontent.com/coreos/flanne/master/Documentation/kubeflannel.ym
以上地址可能被墙,可以直接获取本地已经下载的kube-flannel.yml运⾏即可,命令如下:
由于yml文件实测有600行,为了篇幅尽可能的短,所以我将yml文件放到另一篇文章里,可复制自己到Linux创建一个文件,点击传送
安装lrzsz,要来传递⽂件(将文件直接可以拖到ssh远程连接的框里,方便)
yum -y install lrzsz
直接拖过来然后选最后一个就行
可以看到执行成功
[root@k8s-node1 k8s]# kubectl apply -f kube-flannel.yml
同时flannel.yml中指定的images访问不到可以去docker hub找⼀个wget yml地址vi 修改yml 所有amd64的地址修改了即可
等待⼤约3分钟
kubectl get pods -n kube-system 查看指定名称空间的pods
kubectl get pods —all-namespaces 查看所有名称空间的pods
$ ip link set cni0 down
如果⽹络出现问题,关闭cni0,重启虚拟机继续测试
执⾏watch kubectl get pod -n kube-system -o wide 监控pod进度
等待3-10分钟,完全都是running以后继续
我这里没有出现这个问题,执行 kubectl get pods —all-namespaces命令以后全部都是Running 状态
查看命名空间:
[root@k8s-node1 k8s]# kubectl get pods --all-namespaces
查看master上的节点信息:
[root@k8s-node1 k8s]# kubectl get nodes
4.7 加⼊kubenetes的Node节点
这里的令牌就是我上面说的那个要保存下来的令牌,不要用我这里这个,没用的,用自己的。
kubeadm join 10.0.2.15:6443 —token 0e47ye.g2hp4d4pbliz6z0a
–discovery-token-ca-cert-hash
sha256:f8d5bf40cdb6e6d1172f423aaf22eeffd3893e14c4bfa8c0523ab4f5eaa6d415
最后再次执⾏,并且分别在“k8s-node2”和“k8s-node3”上也执⾏这⾥命令:
kubeadm join 10.0.2.15:6443 --token nqkilj.vbonqoiq3yf0jj1h \
--discovery-token-ca-cert-hash
sha256:dbd6ecc2ac65cf8ad12d878d114b1ff74ece97184cb2755fc2f3a8e4b0f40be5
等待1分钟就装好了
[root@k8s-node1 opt]# kubectl get nodes;
监控pod进度
watch kubectl get pod -n kube-system -o wide
等到所有的status都变为running状态后,再次查看节点信息:
[root@k8s-node1 ~]# kubectl get nodes;
在node节点中执⾏,向集群中添加新的节点,执⾏在kubeadm init 输出的kubeadm join命令;
确保node节点成功:
下面是重新生成令牌的命令。如果我们上面执行成功,即可不执行下面的步骤,如果执行的过程token过期了,用下面的命令重新生成令牌就行。
token过期怎么办
kubeadm token create --print-join-command
再次执⾏join命令
kubeadm join 10.0.2.5:6443 --token nqkilj.vbonqoiq3yf0jj1h \
--discovery-token-ca-cert-hash
sha256:dbd6ecc2ac65cf8ad12d878d114b1ff74ece97184cb2755fc2f3a8e4b0f40be5
还没有评论,来说两句吧...