目录

K8S核心组件和架构图

K8S集群的搭建

准备3台centos

更新并安装依赖

安装Docker

修改hosts文件

系统基础前提配置

 

安装kubeadm, kubelet and kubectl

拉取镜像

初始化master节点

部署calico网络插件

kube join


K8S核心组件和架构图

K8S也叫Kubernetes,是一种容器编排工具

K8S的最小操作单位是Pod,Pod中有一个或多个Container;Pod是ReplicaSet通过selector来进行管理;ReplicaSet之上是由Deployment进行管理。

Label将Pod进行分门别类,具有相同label的Pod成为一个Service

一个机器成为一个节点node,一个node上可以允许多个Pod,多个node组成一个集群。下面是一个K8S集群的

图中各个组件的含义

01-一个操作集群的客户端,也就是和集群打交道
kubectl

02-请求到达Master Node,然后再分配给Worker Node创建Pod之类的
关键是命令通过kubectl过来之后,要认证授权。

03-请求过来之后,Master Node中APIServer来接收。

04-API收到请求之后,接下来调用哪个Worker Node创建Pod,Container之类的,得要有调度策略
Scheduler

05-Scheduler通过不同的策略,真正要分发请求到不同的Worker Node上创建内容,具体由Controller Manager负责

06-Worker Node接收到创建请求之后,具体谁来负责
Kubelet服务,最终Kubelet会调用Docker Engine,创建对应的容器

07-DNS涉及到域名解析。

08-Dashboard监测整个集群的状态

09-ETCD保存集群中的数据,分布式存储

K8S集群的搭建

准备3台centos

创建目录k8s-docker-centos7,创建Vagrantfile文件

boxes = [
	{
		:name => "master-kubeadm-k8s",
		:eth1 => "192.168.1.51",
		:mem => "2048",
		:cpu => "2",
		:sshport => 22230
	},
	{
		:name => "worker01-kubeadm-k8s",
		:eth1 => "192.168.1.52",
		:mem => "2048",
		:cpu => "2",
		:sshport => 22231
	},
	{
		:name => "worker02-kubeadm-k8s",
		:eth1 => "192.168.1.53",
		:mem => "2048",
		:cpu => "2",
		:sshport => 22232
	}
]
Vagrant.configure(2) do |config|
	config.vm.box = "centos/7"
	boxes.each do |opts|
		config.vm.define opts[:name] do |config|
			config.vm.hostname = opts[:name]
			config.vm.network :public_network, ip: opts[:eth1]
			config.vm.network "forwarded_port", guest: 22, host: 2222, id: "ssh", disabled: "true"
		config.vm.network "forwarded_port", guest: 22, host: opts[:sshport]
			config.vm.provider "vmware_fusion" do |v|
				v.vmx["memsize"] = opts[:mem]
				v.vmx["numvcpus"] = opts[:cpu]
			end
			config.vm.provider "virtualbox" do |v|
				v.customize ["modifyvm", :id, "--memory", opts[:mem]]
			v.customize ["modifyvm", :id, "--cpus", opts[:cpu]]
				v.customize ["modifyvm", :id, "--name", opts[:name]]
			end
		end
	end
end

vagrant up启动虚拟机,vagrant ssh master-kubeadm-k8s [进入manager-node],vagrant ssh worker01-kubeadm-k8s [进入worker01-node],vagrant ssh worker02-kubeadm-k8s [进入worker02-node]

分别登陆三个节点,执行下面操作

sudo -i [进入root账户]
vi /etc/ssh/sshd_config [设置root账户可以密码登陆]
修改PasswordAuthentication yes
passwd [修改密码]
systemctl restart sshd [重启sshd服务]

更新并安装依赖

3台机器都需要执行

yum -y update
yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp

安装Docker

3台机器都需要执行,安装版本为18.09.0

  • 卸载之前安装的docker
    sudo yum remove docker docker latest docker-latest-logrotate \
        docker-logrotate docker-engine docker-client docker-client-latest docker-common

     

  • 安装必要依赖
    sudo yum install -y yum-utils device-mapper-persistent-data lvm2

     

  • 添加软件源信息
     sudo yum-config-manager \
        --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
        yum list | grep docker-ce

     

  • 更新yum缓存
    sudo yum makecache fast

     

  • 安装docker
    sudo yum install -y docker-ce-18.09.0 docker-ce-cli-18.09.0 containerd.io

     

  • 启动docker并设置开机启动
    sudo systemctl start docker && sudo systemctl enable docker

    修改hosts文件

  • 设置master的hostname,并且修改hosts文件
    sudo hostnamectl set-hostname m

     

  • 设置worker01/02的hostname,并且修改hosts文件
    sudo hostnamectl set-hostname w1
    	sudo hostnamectl set-hostname w2

     

  • 三台机器添加hosts文件
    vi /etc/hosts
    # ====================================================================================
    10.13.11.21 m
    10.13.11.22 w1
    10.13.11.23 w2
    # ====================================================================================

     

  • 使用ping测试一下
    ping m
    ping w1
    ping w2

    系统基础前提配置

  • 关闭防火墙,放开所有端口
    systemctl stop firewalld && systemctl disable firewalld

     

  • 关闭selinux,SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源(最小权限原则),用来加强安全性的一个组件,但非常容易出错且难以定位。为减少搭建时不必要的麻烦
    setenforce 0
    sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

     

  • 关闭swap,这个当内存不足时,linux会自动使用swap,将部分内存数据存放到磁盘中,这个这样会使性能下降,为了性能考虑推荐关掉
    swapoff -a
    sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab

     

  • 配置iptables的ACCEPT规则
    iptables -F && iptables -X && iptables \
        -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT

     

  • 设置系统参数
    cat <<EOF >  /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    
    sysctl --system

     

安装kubeadm, kubelet and kubectl

  • 配置yum源
    cat <<EOF > /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
    enabled=1
    gpgcheck=0
    repo_gpgcheck=0
    gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
           http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF

     

  • 安装kubeadm&kubelet&kubectl ,我这里原先是安装了1.14.0-0版本,但是报错依赖包没有,为了减少额外的麻烦,我这里直接安装了最新的版本
    yum install -y kubeadm kubelet kubectl
  • docker和k8s设置同一个cgroup
    # docker
    	vi /etc/docker/daemon.json 【文件没内容的话,就新建;有的话,就加上这一句,注意文件的格式[逗号]】
    # ====================================================================================
    {
    	"exec-opts": ["native.cgroupdriver=systemd"]
    }
    # ====================================================================================  
    	systemctl restart docker 【`重启docker,一定要执行`】
    # kubelet
    	sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 【`找不到内容没关系`】
    	systemctl enable kubelet && systemctl start kubelet 【`重启kubelet,一定要执行`】

     

拉取镜像

  • 查看kubeadm使用的镜像
    kubeadm config images list
    
    # ====================================================================================
    k8s.gcr.io/kube-apiserver:v1.20.0
    k8s.gcr.io/kube-controller-manager:v1.20.0
    k8s.gcr.io/kube-scheduler:v1.20.0
    k8s.gcr.io/kube-proxy:v1.20.0
    k8s.gcr.io/pause:3.2
    k8s.gcr.io/etcd:3.4.13-0
    k8s.gcr.io/coredns:1.7.0
    # ====================================================================================

     

  • 解决国外镜像不能访问的问题
# 创建kubeadm.sh脚本,用于拉取镜像/打tag/删除原有镜像
	vi kubeadm.sh
# ====================================================================================
#!/bin/bash
set -e
KUBE_VERSION=v1.20.0
KUBE_PAUSE_VERSION=3.2
ETCD_VERSION=3.4.13-0
CORE_DNS_VERSION=1.7.0
GCR_URL=k8s.gcr.io
ALIYUN_URL=registry.cn-hangzhou.aliyuncs.com/google_containers
images=(kube-proxy:${KUBE_VERSION}
kube-scheduler:${KUBE_VERSION}
kube-controller-manager:${KUBE_VERSION}
kube-apiserver:${KUBE_VERSION}
pause:${KUBE_PAUSE_VERSION}
etcd:${ETCD_VERSION}
coredns:${CORE_DNS_VERSION})
for imageName in ${images[@]} ; do
	docker pull $ALIYUN_URL/$imageName
	docker tag  $ALIYUN_URL/$imageName $GCR_URL/$imageName
	docker rmi $ALIYUN_URL/$imageName
done
# ====================================================================================
  • 运行脚本和查看镜像
    sh ./kubeadm.sh 【运行脚本】
    	docker images 【查看镜像】

初始化master节点

  • 初始化master节点
    kubeadm reset 【初始化集群状态】
    	kubeadm init --kubernetes-version=1.20.0 \
        --apiserver-advertise-address=192.168.1.51 \
        --pod-network-cidr=10.244.0.0/16 【初始化master节点】
    
    # 注意:记得保存好最后kubeadm join的信息。
    # =======================================================================================
    Your Kubernetes control-plane has initialized successfully!
    
    To start using your cluster, you need to run the following as a regular user:
    
      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
    You should now deploy a pod network to the cluster.
    Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
      https://kubernetes.io/docs/concepts/cluster-administration/addons/
    
    Then you can join any number of worker nodes by running the following on each as root:
    
    kubeadm join 192.168.1.51:6443 --token fag134.3wot9edrvs82vh6d \
        --discovery-token-ca-cert-hash sha256:1df02a06552c02ba0e28e00c80a50e9ff40da81a4cdd53c136a16d3c0233f450

     

  • 根据日志提示执行
    mkdir -p $HOME/.kube
    	sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    	sudo chown $(id -u):$(id -g) $HOME/.kube/config

     

  • 查看pod。我这里由于是在4核16G的win10上搭建了三台2核2G的centos,所以,我等了一晚上coredns的状态才变为running
    等待一会儿,同时可以发现像etcd,controller,scheduler等组件都以pod的方式安装成功了
    # 注意:coredns没有启动,需要安装网络插件
    	kubectl get pods -n kube-system 【查看kube-system的pods】
    	kubectl get pods --all-namespaces 【查看所有pods】
    # =======================================================================================
    NAME                        READY   STATUS    RESTARTS   AGE
    coredns-fb8b8dccf-f7g6g     0/1     Pending   0          7m30s
    coredns-fb8b8dccf-hx765     0/1     Pending   0          7m30s
    etcd-m                      1/1     Running   0          6m30s
    kube-apiserver-m            1/1     Running   0          6m36s
    kube-controller-manager-m   1/1     Running   0          6m42s
    kube-proxy-w9m72            1/1     Running   0          7m30s
    kube-scheduler-m            1/1     Running   0          6m24s

     

  • 健康检查
    curl -k https://localhost:6443/healthz

     

部署calico网络插件

  • 在k8s中安装calico
    kubectl apply -f https://docs.projectcalico.org/v3.9/manifests/calico.yaml

     

  • 确认一下calico是否安装成功,在这里,我等了一晚上。。。。配置太差
    kubectl get pods --all-namespaces -w

     

kube join

将之前的kube join(自己的)在woker01和worker02上执行上述命令

kubeadm join 192.168.1.51:6443 --token fag134.3wot9edrvs82vh6d \
    --discovery-token-ca-cert-hash sha256:1df02a06552c02ba0e28e00c80a50e9ff40da81a4cdd53c136a16d3c0233f450

在master节点上检查集群信息 ,在这里我也等待了很长时间

kubectl get nodes

自此,K8S集群已搭建完成

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐