k8s集群安装----(一)

﹏ヽ暗。殇╰゛Y 2024-04-07 13:05 146阅读 0赞

安装前提示,不要放C盘,不要放C盘,不要放C盘

1 kubeadm

kubeadm是官⽅社区推出的⼀个⽤于快速部署kuberneters集群的⼯具。
这个⼯具能通过两条指令完成⼀个kuberneters集群的部署
创建⼀个master节点

  1. $ kuberneters init

将⼀个node节点加⼊到当前集群中

  1. $ kubeadm join <Master节点的IP和端⼝>

上述步骤会在接下来的节点安装好有步骤,可以先按照下面的步骤去部署好节点。

2 前置要求

⼀台或多台机器,操作系统Centos7.x-86_x64
硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
集群中所有的机器之间⽹络互通
可以访问外⽹,需要拉取镜像
禁⽌Swap分区

3 部署步骤

  1. 在所有的节点上安装Docker和kubeadm
  2. 部署Kubernetes Master
  3. 部署容器⽹络插件
  4. 部署Kubernetes Node,将节点加⼊Kubernetes集群中
  5. 部署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的目录下,把下面的配置文件放进去就会生成了三个节点。
在这里插入图片描述

  1. Vagrant.configure("2") do |config|
  2. (1..3).each do |i|
  3. config.vm.define "node#{i}" do |node|
  4. # 设置虚拟机的Box
  5. node.vm.box = "centos/7"
  6. # 设置虚拟机的主机名
  7. node.vm.hostname="node#{i}"
  8. # 设置虚拟机的IP
  9. node.vm.network "private_network", ip: "192.168.56.#{199+i}",
  10. netmask: "255.255.255.0"
  11. # 设置主机与虚拟机的共享⽬录
  12. # node.vm.synced_folder "~/Documents/vagrant/share",
  13. "/home/vagrant/share"
  14. # VirtaulBox相关配置
  15. node.vm.provider "virtualbox" do |v|
  16. # 设置虚拟机的名称
  17. v.name = "node#{i}"
  18. # 设置虚拟机的内存⼤⼩
  19. v.memory = 4096
  20. # 设置虚拟机的CPU个数
  21. v.cpus = 4
  22. end
  23. end
  24. end
  25. 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环境

三个节点都执⾏
关闭防⽕墙

  1. systemctl stop firewalld
  2. systemctl disable firewalld

关闭seLinux

  1. sed -i 's/enforcing/disabled/' /etc/selinux/config
  2. setenforce 0
  3. #查看
  4. cat /etc/selinux/config

在这里插入图片描述
在这里插入图片描述
关闭swap

  1. swapoff -a #临时关闭
  2. sed -ri 's/.*swap.*/#&/' /etc/fstab #永久关闭
  3. free -g #验证,swap必须为0

在这里插入图片描述
如果没有变成0的话就重启一下node节点
在这里插入图片描述
查看主机名
在这里插入图片描述
如果主机名不正确,可以通过“hostnamectl set-hostname :指定新的hostname”命令来进⾏修改。
没有配置前,节点是ping不通的
在这里插入图片描述

  1. ip addr查看对应的ip地址
  2. 10.0.2.15 node1
  3. 10.0.2.4 node2
  4. 10.0.2.5 node3

在这里插入图片描述
现在我们可以ping通了
在这里插入图片描述
K8s的有一大功能就是当某一个节点流量多的时候,他就会自动的拉取多个节点,进行水平扩容。
具体配置如下:

  1. cat > /etc/sysctl.d/k8s.conf <<EOF
  2. net.bridge.bridge-nf-call-ip6tables = 1
  3. net.bridge.bridge-nf-call-iptables = 1
  4. EOF

应⽤规则:

  1. sysctl --system

应用成功
在这里插入图片描述

4.4 安装组件

所有节点安装docker、kubeadm、kubelet、kubectl
Kubenetes默认CRI(容器运⾏时)为Docker,因此先安装Docker。
(1)安装Docker
1、卸载之前的docker

  1. $ sudo yum remove docker \
  2. docker-client \
  3. docker-client-latest \
  4. docker-common \
  5. docker-latest \
  6. docker-latest-logrotate \
  7. docker-logrotate \
  8. docker-engine

在这里插入图片描述

2、安装Docker -CE

  1. $ sudo yum install -y yum-utils \
  2. device-mapper-persistent-data \
  3. lvm2
  4. $ sudo yum-config-manager \
  5. --add-repo \
  6. https://download.docker.com/linux/centos/docker-ce.repo
  7. $ sudo yum -y install docker-ce docker-ce-cli containerd.io

上述三个命令执行情况如下:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
上述步骤Docker就安装好了。

3、配置镜像加速

  1. sudo mkdir -p /etc/docker
  2. sudo tee /etc/docker/daemon.json <<-'EOF'
  3. {
  4. "registry-mirrors": ["https://azk2srw0.mirror.aliyuncs.com"],
  5. "exec-opts": ["native.cgroupdriver=systemd"]
  6. }
  7. EOF
  8. sudo systemctl daemon-reload
  9. sudo systemctl restart docker

上述四条命令直接复制粘贴 执行即可。
4、启动Docker && 设置docker开机启动

  1. systemctl enable docker

在这里插入图片描述

基础环境准备好,可以给三个虚拟机备份⼀下;
在这里插入图片描述
(2)添加阿⾥与Yum源

  1. cat <<EOF > /etc/yum.repos.d/kubernetes.repo
  2. [kubernetes]
  3. name=Kubernetes
  4. baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
  5. enabled=1
  6. gpgcheck=1
  7. repo_gpgcheck=1
  8. gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
  9. https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  10. EOF

更多详情⻅: https://developer.aliyun.com/mirror/kubernetes

(3)安装其他组件
安装kubeadm,kubelet、kubectl

  1. yum list|grep kube

安装

  1. yum install -y kubelet-1.17.3 kubeadm-1.17.3 kubectl-1.17.3

如果这里安装发生错误的话如下:
在这里插入图片描述
在这里插入图片描述
我试了上面只改那一个不行,得把两个校验值都改为0

  1. cat <<EOF > /etc/yum.repos.d/kubernetes.repo
  2. [kubernetes]
  3. name=Kubernetes
  4. baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
  5. enabled=1
  6. gpgcheck=0
  7. repo_gpgcheck=0
  8. gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
  9. https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  10. EOF

在这里插入图片描述

开机启动

  1. systemctl enable kubelet && systemctl start kubelet

在这里插入图片描述

查看kubelet的状态:

  1. systemctl status kubelet

在这里插入图片描述
现在还是一个faild的状态,我们还没有装master和node节点

查看kubelet版本:

  1. kubelet --version

在这里插入图片描述
在这里插入图片描述

4.5 部署k8s-master

(1)master节点初始化
master 初始化比较慢,所以这里从阿里云去下载
各个images的 意思
第一个,暴露api命令的一个服务,接受命令,跟其他客户端进行交互的一个命令
第二个 网络代理
第三个 管理controller的
第四个是调度任务的
第五个是 用来容器的发现,对于服务伸缩经常变动的节点进行管理。
第六个是 键值对的数据库,
第七个是 k8s 进行容器隔离的一个沙箱的机制

在Master节点上,创建并执⾏master_images.sh

  1. #!/bin/bash
  2. images=(
  3. kube-apiserver:v1.17.3
  4. kube-proxy:v1.17.3
  5. kube-controller-manager:v1.17.3
  6. kube-scheduler:v1.17.3
  7. coredns:1.6.5
  8. etcd:3.4.3-0
  9. pause:3.1
  10. )
  11. for imageName in ${
  12. images[@]} ; do
  13. docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
  14. # docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
  15. k8s.gcr.io/$imageName
  16. done

在node节点下创建k8s目录
在这里插入图片描述
在这里插入图片描述
拷贝进去以后保存这个脚本文件,然后执行它
在这里插入图片描述
执行的时候发现没有权限
在这里插入图片描述
提升一下权限。

  1. chmod 777 ./master_images.sh

在这里插入图片描述
再次执行,可以看到执行成功了
在这里插入图片描述
到这里的时候可以看到已经下载完成了。
在这里插入图片描述
使用docker命令可以看到,我们的镜像已经全部下载成功了。
在这里插入图片描述

初始化kubeadm
先查看一下网卡的地址
在这里插入图片描述
下面初始化的地址要和上面查看的保持一致。

  1. kubeadm init \
  2. --apiserver-advertise-address=10.0.2.15 \
  3. --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
  4. --kubernetes-version v1.17.3 \
  5. --service-cidr=10.96.0.0/16 \
  6. --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地址进⾏归类的⽅法。
拉取可能失败,需要下载镜像。
运⾏完成提前复制:加⼊集群的令牌。就是下面这一串需要提前保存好

  1. kubeadm join 10.0.2.15:6443 --token l1wsvh.13x01yyb7y6h12mg \
  2. --discovery-token-ca-cert-hash sha256:25efa6b0b9a981733fecc0e2a169538d08bc29d9b530e746ae20f7a690dff3bb

在这里插入图片描述

(2)测试Kubectl
主节点上执⾏

  1. mkdir -p $HOME/.kube
  2. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  3. sudo chown $(id -u):$(id -g) $HOME/.kube/config

详细部署⽂档:https://kubernetes.io/docs/concepts/cluster-administration/addons/

在这里插入图片描述

  1. $ kubectl get nodes #获取所有节点

在这里插入图片描述

⽬前Master状态为notready。等待⽹络加⼊完成即可。

  1. $ journalctl -u kubelet #查看kubelet⽇志

4.6 安装POD⽹络插件(CNI)

在master节点上执⾏按照POD⽹络插件

  1. kubectl apply -f \
  2. https://raw.githubusercontent.com/coreos/flanne/master/Documentation/kubeflannel.ym

以上地址可能被墙,可以直接获取本地已经下载的kube-flannel.yml运⾏即可,命令如下:
在这里插入图片描述
由于yml文件实测有600行,为了篇幅尽可能的短,所以我将yml文件放到另一篇文章里,可复制自己到Linux创建一个文件,点击传送

安装lrzsz,要来传递⽂件(将文件直接可以拖到ssh远程连接的框里,方便)

  1. yum -y install lrzsz

直接拖过来然后选最后一个就行
在这里插入图片描述
可以看到执行成功
在这里插入图片描述

  1. [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 状态

查看命名空间:
在这里插入图片描述

  1. [root@k8s-node1 k8s]# kubectl get pods --all-namespaces

在这里插入图片描述
查看master上的节点信息:

  1. [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”上也执⾏这⾥命令:

  1. kubeadm join 10.0.2.15:6443 --token nqkilj.vbonqoiq3yf0jj1h \
  2. --discovery-token-ca-cert-hash
  3. sha256:dbd6ecc2ac65cf8ad12d878d114b1ff74ece97184cb2755fc2f3a8e4b0f40be5

在这里插入图片描述
等待1分钟就装好了
在这里插入图片描述

  1. [root@k8s-node1 opt]# kubectl get nodes;

在这里插入图片描述

监控pod进度

  1. watch kubectl get pod -n kube-system -o wide

等到所有的status都变为running状态后,再次查看节点信息:
在这里插入图片描述
在这里插入图片描述

  1. [root@k8s-node1 ~]# kubectl get nodes;

在这里插入图片描述

在node节点中执⾏,向集群中添加新的节点,执⾏在kubeadm init 输出的kubeadm join命令;
确保node节点成功:

下面是重新生成令牌的命令。如果我们上面执行成功,即可不执行下面的步骤,如果执行的过程token过期了,用下面的命令重新生成令牌就行。

token过期怎么办

  1. kubeadm token create --print-join-command

再次执⾏join命令

  1. kubeadm join 10.0.2.5:6443 --token nqkilj.vbonqoiq3yf0jj1h \
  2. --discovery-token-ca-cert-hash
  3. sha256:dbd6ecc2ac65cf8ad12d878d114b1ff74ece97184cb2755fc2f3a8e4b0f40be5

发表评论

表情:
评论列表 (有 0 条评论,146人围观)

还没有评论,来说两句吧...

相关阅读