基于kubeadm方式搭建k8s集群

k8s

        Kubernetes首字母为K,末尾为s,中间一共有8个字母,所以简称K8s,是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes 提供了应用部署,规划,更新,维护的一种机制。

        官网

KubernetesKubernetes 是用于自动部署,扩展和管理容器化应用程序的开源系统。 它将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现。Kubernetes 源自Google 15 年生产环境的运维经验,同时凝聚了社区的最佳创意和实践。 星际尺度 Google 每周运行数十亿个容器,Kubernetes 基于与之相同的原则来设计,能够在不扩张运维团队的情况下进行规模扩展。 处处适用 无论是本地测试,还是跨国公司,Kubernetes 的灵活性都能让你在应对复杂系统时得心应手。 永不过时 Kubernetes 是开源系统,可以自由地部署在企业内部,私有云、混合云或公有云,让您轻松地做出合适的选择。 The Challenges of Migrating 150+ Microservices to Kubernetes -- 将 150+ 微服务迁移到 Kubernetes 上的挑战 By Sarah Wells, Technical Director for Operations and Reliability, Financial Times-- Sarah Wells, 运营和可靠性技术总监, 金融时报Watch Video Attend KubeCon in Shanghai on Nov. 13-15, 2018 -- 参加11月13日到15日的上海 KubeCon Attend KubeCon in Seattle on Dec.https://kubernetes.io/zh/

kubeadm

        kubeadm 是官方社区推出的一个用于快速部署kubernetes 集群的工具,提供kubeadm init 和 kubeadm join,用于快速部署Kubernetes集群。

        参考文档

安装 kubeadm | Kuberneteshttps://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

环境准备

        三台虚拟机(都是CentOS7),一台master,两台node,node1、node2.

        注意:三台虚拟机之间网络互通,同时可以访问外网,禁止swap分区

        硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多【注意master需要两核】

名称 ip
master 192.168.111.129
node1 192.168.111.130
node2 192.168.111.131

禁止swap分区命令

swapoff -a

 启动swap分区命令

swapon -a

永久关闭swap分区命令 

# 永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab

然后开始在每台机器上执行下面的命令

        关闭防火墙

systemctl stop firewalld   #暂时关闭
systemctl disable firewalld   #永久关闭

# 关闭selinux

# 永久关闭
sed -i 's/enforcing/disabled/' /etc/selinux/config  
# 临时关闭
setenforce 0  

设置主机名

# 根据规划设置主机名【master节点上操作】
hostnamectl set-hostname k8smaster
# 根据规划设置主机名【node1节点操作】
hostnamectl set-hostname k8snode1
# 根据规划设置主机名【node2节点操作】
hostnamectl set-hostname k8snode2

在master添加hosts

cat >> /etc/hosts << EOF
192.168.111.129 k8smaster
192.168.111.130 k8snode1
192.168.111.131 k8snode2
EOF

将桥接的IPv4流量传递到iptables的链 (每台虚拟机都设置)

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

 生效

sysctl --system   

时间同步(每台虚拟机上执行)

yum install ntpdate -y
ntpdate time.windows.com

安装Docker/kubeadm/kubelet

        所有节点安装Docker/kubeadm/kubelet ,Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker

安装Docker

首先配置一下Docker的阿里yum源

cat >/etc/yum.repos.d/docker.repo<

基于kubeadm方式搭建k8s集群_第1张图片

然后yum方式安装docker

yum安装

yum -y install docker-ce

基于kubeadm方式搭建k8s集群_第2张图片

查看docker版本

docker --version 

启动docker

systemctl enable docker
systemctl start docker

配置阿里云镜像加速
        进入阿里云官网,找到容器镜像服务下的镜像加速器

阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台欢迎登录阿里云,全球领先的云计算及人工智能科技公司,阿里云为200多个国家和地区的企业、开发者和政府机构提供云计算基础服务及解决方案。阿里云云计算、安全、大数据、人工智能、企业应用、物联网等云计算服务。https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors基于kubeadm方式搭建k8s集群_第3张图片

地址换成自己的地址,依次执行官方的这四条命令

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

添加kubernetes软件源

然后我们还需要配置一下yum的k8s软件源

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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

基于kubeadm方式搭建k8s集群_第4张图片

安装kubeadm,kubelet和kubectl

由于版本更新频繁,这里指定版本号部署:

# 安装kubelet、kubeadm、kubectl,同时指定版本
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
# 设置开机启动
systemctl enable kubelet

基于kubeadm方式搭建k8s集群_第5张图片

部署Kubernetes Master【master节点】

在 192.168.111.129 执行,也就是master节点

kubeadm init --apiserver-advertise-address=192.168.111.129 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.96.0.0/12  --pod-network-cidr=10.244.0.0/16

 报错说我的cpu是单核的,最少需要双核

,于是修改为双核的 

基于kubeadm方式搭建k8s集群_第6张图片

再次执行成功

 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址,【执行上述命令会比较慢,因为后台其实已经在拉取镜像了】,我们 docker images 命令即可查看已经拉取的镜像

docker images

基于kubeadm方式搭建k8s集群_第7张图片

当我们出现下面的情况时,表示kubernetes的镜像已经安装成功 

基于kubeadm方式搭建k8s集群_第8张图片

使用kubectl工具 【master节点操作】

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

 执行完成后,我们使用下面命令,查看我们正在运行的节点

kubectl get nodes

基于kubeadm方式搭建k8s集群_第9张图片

 能够看到,目前有一个master节点已经运行了,但是还处于未准备状态

下面我们还需要在Node节点执行其它的命令,将node1和node2加入到我们的master节点上

加入Kubernetes Node【Slave节点】

下面我们需要到 node1 和 node2服务器,执行下面的代码向集群添加新节点

执行在kubeadm init输出的kubeadm join命令:

注意,以下的命令是在master初始化完成后,每个人的都不一样!!!需要复制自己生成的

kubeadm join 192.168.111.129:6443 --token q7v792.m6o4sxqt1h2y52zr \
    --discovery-token-ca-cert-hash sha256:38867c3254c20d1f98bcab42a7e08a1c2bca4d05b2fa624a24b6de6dc39ac81

基于kubeadm方式搭建k8s集群_第10张图片

 node1执行命令

基于kubeadm方式搭建k8s集群_第11张图片

报错,发现是之前禁止swap没成功导致

swapoff: /dev/dm-1: swapoff failed: Cannot allocate memory

解决方法很简单,直接 reboot,然后才开机的时候(内存使用最少)关闭分区。

基于kubeadm方式搭建k8s集群_第12张图片

报错,fatal error: runtime: out of memory

修改虚拟机内存,我之前是1G

基于kubeadm方式搭建k8s集群_第13张图片

再次执行命令再报错,connect: no route to host,跟node2执行报一样的错,后面node2解决

 node2执行命令

 报错,error execution phase preflight: couldn't validate the identity of the API Server: expected a 32 byte SHA-256 hash, found 31 bytes

解决方法

# master 查看节点检查token是否有效
kubeadm token list
# 生成新的token和命令。然后在node重新执行
kubeadm token create --print-join-command

生成新的命令后再执行

 报错,connect: no route to host

重新执行关闭防火墙等那些命令后重试解决

基于kubeadm方式搭建k8s集群_第14张图片

基于kubeadm方式搭建k8s集群_第15张图片

当我们把两个节点都加入进来后,我们就可以去Master节点 执行下面命令查看情况

kubectl get nodes

基于kubeadm方式搭建k8s集群_第16张图片

部署CNI网络插件

上面的状态还是NotReady,下面我们需要网络插件,来进行联网访问

下载网络插件配置
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

 报错,安装wget

yum install wget -y

基于kubeadm方式搭建k8s集群_第17张图片

再次保存后执行

基于kubeadm方式搭建k8s集群_第18张图片

 默认镜像地址无法访问,sed命令修改为docker hub镜像仓库

# 添加
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

# 查看状态 【kube-system是k8s中的最小单元】
kubectl get pods -n kube-system

基于kubeadm方式搭建k8s集群_第19张图片

 运行完成后,我们查看状态可以发现,已经变成了Ready状态

kubectl get nodes

基于kubeadm方式搭建k8s集群_第20张图片

 如果上述操作完成后,还存在某个节点处于NotReady状态,可以在Master将该节点删除

kubectl delete node k8snode1

然后到k8snode1节点进行重置

kubeadm reset

重置完后在加入

kubeadm join 192.168.111.129:6443 --token l2yyw9.dswy2nv9d5j1nrit     --discovery-token-ca-cert-hash sha256:38867c3254c20d1f98bcab42a7e08a1c2bca4d05b2fa624a24b6de6dc39ac810

你可能感兴趣的:(linux,Kubernetes,kubeadm,k8s集群,Linux,Docker)