kubeadm部署k8s集群最全最详细

一、安装要求

kubeadm安装kubernetes1.15

在开始之前,部署Kubernetes集群机器需要满足以下几个条件:

1、一台或多台机器(≥3奇数个),操作系统 CentOS7.x(最好是不低于4.4的内核版本),因为CentOS 7.x 系统自带的3.10.x内核存在一些Bugs.导致运行的Docker.Kubernetes不稳定。

2、硬件配置:至少2GB内存或更多RAM,至少2个CPU或更多CPU,至少硬盘30GB或更多

3、集群中所有机器之间网络互通

4、可以访问外网,需要拉取镜像

5、禁止swap分区

#RAM:随机存取记忆体(RandomAccessMemory),是一种在电脑中用来暂时保存数据的元件。

环境规划(修改host文件【非集群环境可省略】

cat >> /etc/hosts<<EOF
10.12.237.17            k8s-master(4cpu,4G,50G)
10.12.237.19            k8s-node1(2cpu,2G,30G)
10.12.237.18             k8s-node2(2cpu,2G,30G)
EOF

二、系统设置

#三台服务器分别设置主机名

hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2

#安装依赖包

yum -y install conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget git vim net-tools

#设置防火墙为lptables 并设置空规则

systemctl stop firewalld && systemctl disable firewalld

yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save

#关闭swap分区和SELINUX(如果不关闭,默认配置下kubelet将无法启动。使用free -m确认swap已经关闭。)

swapoff -a && sed -ri 's/.*swap.*/#&/' /etc/fstab

setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

#修改时区并关闭系统不需要d的服务

timedatectl set-timezone Asia/Shanghai
timedatectl set-local-rtc 0
systemctl restart rsyslog
systemctl restart crond
systemctl stop postfix && systemctl disable postfix

 #下面是修改之前的时区:

#修改之后正确的显示如下:

#Kubernetes调整内核参数(三个重要部分是必须条件,将桥接的IPv4流量传递到iptables的链)

cat > kubernetes.conf<<EOF
#开启网桥模式【重要】
net.bridge.bridge-nf-call-iptables=1
#开启网桥模式【重要】
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
#禁止使用swap空间,只有当系统OOM时才允许使用它
vm.swappiness=0
#不检查物理内存是否够用
vm.overcommit_memory=1
#开启OOM
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
#关闭ipv6【重要】
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF

#将优化内核文件拷贝到/etc/sysctl.d/文件夹下,这样优化文件开机的时候能够被调用

cp kubernetes.conf /etc/sysctl.d/kubernetes.conf

#手动加载内核文件,立即生效

modprobe ip_conntrack

sysctl -p /etc/sysctl.d/kubernetes.conf

#设置日志的保存方式

#在Centos7以后,因为引导方式改为了system.d,所以有两个日志系统同时在工作,默认的是rsyslogd,以及systemd journald,使用systemd journald更好一些,因此我们更改默认为systemd journald,只保留一个日志的保存方式。

#持久化保存日志的目录

mkdir /var/log/journal
mkdir /etc/systemd/journal.conf.d
cat >/etc/systemd/journal.conf.d/99-prophet.conf <<EOF
[Journal]
#持久化保存到磁盘
Storage=persistent
#压缩历史日志
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
#最大占用空间10G
SystemMaxUse=10G
#单日志文件最大200M
SystemMaxFileSize=200M
#日志保存时间2周
MaxRetentionSec=2week
#不将日志转发到syslog
ForwardToSyslog=no
EOF

systemctl restart systemd-journald

#升级Linux内核为4.44版本:

https://blog.csdn.net/Doudou_Mylove/article/details/102818959
#查看内核升级是否成功

[root@k8s-master ~]# uname -a

Linux k8s-master 4.4.196-1.el7.elrepo.x86_64 #1 SMP Mon Oct 7 16:17:40 EDT 2019 x86_64 x86_64 x86_64 GNU/Linux

#kube-proxy开启ipvs的前置条件

modprobe br_netfilter
cat >/etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules
bash /etc/sysconfig/modules/ipvs.modules && lsmod |grep -e ip_vs -e nf_conntrack_ipv4

三、安装docker

1、安装docker

#一定要安装18.09版docker,否则在初始化k8s master的时候会提示:[WARNING SystemVerification]: this Docker version is not on the list of validated versions: 19.03.3. Latest validated version: 18.09

yum install -y yum-utils
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum -y install docker-ce-18.09.0 docker-ce-cli-18.09.0 containerd.io
systemctl start docker

systemctl enable docker

#到这里建议重启一台服务器再次看出内核是否又回到旧版本,如果是就重新执行如下命令(教程视频中讲师有发生过这种情况,我自己没遇到过):

grub2-set-default 0 && reboot

2、修改docker cgroup driver为systemd并重启docker:

#根据文档CRI installation中的内容,对于使用systemd作为init system的Linux的发行版,使用systemd作为docker的cgroup driver可以确保服务器节点在资源紧张的情况更加稳定,因此这里修改各个节点上docker的cgroup driver为systemd(k8s给出的解释, 大致的意思是:

systemd是系统自带的cgroup管理器, 系统初始化就存在的, 和cgroups联系紧密,为每一个进程分配cgroups, 用它管理就行了. 如果设置成cgroupfs就存在2个cgroup控制管理器, 实验证明在资源有压力的情况下,会存在不稳定的情况.)。

创建或修改/etc/docker/daemon.json:

cat >/etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts":{
    "max-size": "100m"
}
}
EOF
systemctl daemon-reload
systemctl restart docker

3、查看结果:

docker info | grep Cgroup

四、用kubeadm安装k8s集群

#配置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

#浏览器访问测试地址,是否可用,如果不可用需要科学上网。

https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64

安装k8s组件,kubeadm,kubelet和kubectl

#由于版本更新频繁,这里指定版本号部署(我第一次安装没指定版本号报错提示版本过高,当时是1.16版)

#yum makecache fast

yum install -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0

systemctl enable kubelet

#systemctl start kubelet(先不启动)

#以上内容三台服务器都需安装

安装k8s集群

#初始化准备

#!/bin/sh
### 版本信息
K8S_VERSION=v1.15.1
ETCD_VERSION=3.3.10
#DASHBOARD_VERSION=v1.8.3
FLANNEL_VERSION=v0.12.0-amd64
#DNS_VERSION=1.14.8
PAUSE_VERSION=3.1
coredns_version=1.3.1
## 基本组件
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver-amd64:$K8S_VERSION
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager-amd64:$K8S_VERSION
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler-amd64:$K8S_VERSION
docker pull aiotceo/kube-proxy:$K8S_VERSION
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd-amd64:$ETCD_VERSION
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:$PAUSE_VERSION
### 网络
#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-dns-sidecar-amd64:$DNS_VERSION
#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-dns-kube-dns-amd64:$DNS_VERSION
#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-dns-dnsmasq-nanny-amd64:$DNS_VERSION
docker pull quay.io/coreos/flannel:$FLANNEL_VERSION
docker pull registry.cn-hangzhou.aliyuncs.com/openthings/k8s-gcr-io-coredns:$coredns_version
### 前端
#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kubernetes-dashboard-amd64:$DASHBOARD_VER
## 修改tag
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver-amd64:$K8S_VERSION k8s.gcr.io/kube-apiserver-amd64:$K8S_VERSION
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager-amd64:$K8S_VERSION k8s.gcr.io/kube-controller-manager-amd64:$K8S_VERSION
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler-amd64:$K8S_VERSION k8s.gcr.io/kube-scheduler-amd64:$K8S_VERSION
#docker tag registry.cn-hangzhou.aliyuncs.com/openthings/k8s-gcr-io-kube-proxy-amd64:$K8S_VERSION k8s.gcr.io/kube-proxy-amd64:$K8S_VERSION
docker tag aiotceo/kube-proxy:$K8S_VERSION k8s.gcr.io/kube-proxy-amd64:$K8S_VERSION
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd-amd64:$ETCD_VERSION k8s.gcr.io/etcd-amd64:$ETCD_VERSION
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:$PAUSE_VERSION k8s.gcr.io/pause:$PAUSE_VERSION
#docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-dns-sidecar-amd64:$DNS_VERSION k8s.gcr.io/k8s-dns-sidecar-amd64:$DNS_VERSION
#docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-dns-kube-dns-amd64:$DNS_VERSION k8s.gcr.io/k8s-dns-kube-dns-amd64:$DNS_VERSION
#docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-dns-dnsmasq-nanny-amd64:$DNS_VERSION k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64:$DNS_VERSION
#docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kubernetes-dashboard-amd64:$DASHBOARD_VERSION k8s.gcr.io/kubernetes-dashboard-amd64:$DASHBOARD_VERSION
docker tag registry.cn-hangzhou.aliyuncs.com/openthings/k8s-gcr-io-coredns:$coredns_version  k8s.gcr.io/coredns:$coredns_version
## 删除镜像
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver-amd64:$K8S_VERSION
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager-amd64:$K8S_VERSION
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler-amd64:$K8S_VERSION
#docker rmi registry.cn-hangzhou.aliyuncs.com/openthings/k8s-gcr-io-kube-proxy-amd64:$K8S_VERSION
docker rmi aiotceo/kube-proxy:$K8S_VERSION
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/etcd-amd64:$ETCD_VERSION
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:$PAUSE_VERSION
#docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-dns-sidecar-amd64:$DNS_VERSION
#docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-dns-kube-dns-amd64:$DNS_VERSION
#docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-dns-dnsmasq-nanny-amd64:$DNS_VERSION
#docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kubernetes-dashboard-amd64:$DASHBOARD_VERSION
docker rmi registry.cn-hangzhou.aliyuncs.com/openthings/k8s-gcr-io-coredns:$coredns_version

三台机器分别执行上面脚本下载镜像:./k8s_image.sh

初始化主节点(master)

#显示默认的init初始化文件并打印出来存放到指定位置

kubeadm config print init-defaults >kubeadm-config.yaml

#编辑kubeadm-config.yaml,修改本机服务器IP和版本号

advertiseAddress: 10.12.237.17

kubernetesVersion: v1.15.1

#添加pod网段(kubernetesVersion上一行添加即可)

  podSubnet: "10.244.0.0/16"

#另外再添加一个字段,把默认的调度方式改为ipvs模式(最后scheduler: {}下面)

---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
  SupportIPVSProxyMode: true
mode: ipvs

初始化安装并自动颁发证书

kubeadm init --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.15.1

#所有的初始化过程信息可以通过kubeadm-init.log文件查看

例如:

环境变量(env)存放的位置:/var/lib/kubelet/kubeadm-flags.env

kubelet配置文件存放位置:/var/lib/kubelet/config.yaml

k8s所有证书的存放位置:/etc/kubernetes/pki

配置文件放在:/etc/Kubernetes

初始化执行结果如下:

根据提示操作:

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是因为还未部署flannel网络):

部署网络-flannel

Kubernetes 系统上 Pod 网络的实现依赖于第三方插件,而 Flannel 是由 CoreOS主推的目前比较主流的容器网络解决方案,CNI 插件有两种功能:网络配置和网络策略,由于 flannel 比较简单,并不支持网络策略,flannel 项目自身只是一个框架,真正提供网络功能的是它的后端实现,目前,Flannel 支持三种不同后端实现,分别是:

· UDP( 是 Flannel 项目最早支持的一种方式,是性能最差的方式,目前已被废弃。)

· VXLAN(目前使用较多)

· host-gw

#部署前准备

mkdir install-k8s
mkdir install-k8s/core
mv kubeadm-init.log kubeadm-config.yaml install-k8s/core/
cd install-k8s/
mkdir plugin
mkdir plugin/flannel
cd plugin/flannel/

#下载flannel文件(如果一次失败可以多试两次,或者直接换台公有云服务器下载):

wget https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml

#创建flannel网络

kubectl apply -f kube-flannel.yml

创建完成后查看pod的状态如下(原因可能是是网络差创建flannel的时候有一个pull flannel镜像的过程,等两分钟即可):

kubectl get pod -n kube-system

#-n 后面指定的名称空间,默认k8s的所有系统主键都默认安装在kebe-system的名称空间下,如果不加-n namespace则默认使用default的名称空间

等两分钟之后pod状态变成Running,并会多了一个flannel镜像

#如果一直报错可以查看日志信息(注意指定名称空间参数--namespace=):

#kubectl describe --namespace=kube-system pod kube-flannel-ds-amd64-vfbvb

再查看node节点状态已经变成“ready”

#运行正常后,flanneld 会在宿主机的/etc/cni/net.d 目录下生成自已的配置文件,kubelet 将会调用它。 网络插件运行成功后,Node 状态才 Ready

同时使用ifconfig命令可以看到多加了一块flannel.1的网卡

flannel详解:

1. flannel 默认就是 VXLAN 模式,即 Overlay Network(全覆盖网络)。

2. flanneld 创建了一个 flannel.1 接口,它是专门用来封装隧道协议的,默认分给集群的 Pod 网段为 10.244.0.0/16。

3. flannel 给 k8s-master 节点配置的 Pod 网络为 10.244.0.0 段,给 k8s-node01 节点配置的 Pod 网络为 10.244.1.0 段,如果有更多的节点,以此类推。

#vxlan(虚拟可扩展局域网):是一种基于IP网络(L3)的基础上虚拟(L2)网络连接的解决方案,为多用租户平台提供了虚拟网络强大的扩展能力和隔离性。

# overlay network (全覆盖网络)简单说来覆盖网络就是应用层网络,它是面向应用层的

#2012年10月,Linux内核增加了vxlan支持,内核的版本要求3.7+,所以一开始我们就把内核升级到4.4的版本。

清理flannel网络

一、master节点删除flannel(下面删除方式二选一)

1、kubectl delete -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

2、进入存放kube-flannel.yml文件的目录直接删除:

#kubectl delete -f kube-flannel.yml

二、在所有节点清理flannel网络留下的文件(如果没有创建pod那么cni0网桥只有master存在,意味着只要服务器上有cni0和flannel.l就需要执行下面命令)

ifconfig cni0 down

ip link delete cni0

ifconfig flannel.1 down

ip link delete flannel.1

rm -rf /var/lib/cni/

rm -f /etc/cni/net.d/*

#注意如果有vteh设备的也要清理掉

ifconfig vethdc52a97e down

ip link delete vethdc52a97e

三、清理完成后要重启kubelet

systemctl restart kubelet

#上面内容只在master节点操作

子节点加入集群

#master初始化的时候最后打印出如下信息,明显告诉你子节点要加入工作的话需要的执行如下命令

#分别在两个 Node 节点执行

kubeadm join 10.12.237.17:6443 --token abcdef.0123456789abcdef \

--discovery-token-ca-cert-hash sha256:1bc56d762687199cadade6c5a9f8f4224f6b94f875081a630e3fab84c42ae19f

#两台node节点执行结果如下图:

同样node节点加入集群后也会生成一个flannel.1网桥设备

回到主节点再查看node发现一台变成三台并且从notready变成ready。

master节点详细查看集群原始pod分布情况

kubectl get pod -n kube-system -o wide

#-o wide:查看详细信息

最后查看集群健康状态:

kubectl get cs

#默认情况下集群部署完成后master节点最初有9个pod加上每个pod对应一个pause一共是18个容器,node节点是两个pod对应两个pause一共是4个容器

#只要运行一个pod就会同时伴随启动一个pause;

官网中是这样解释的:

pause是Kubernetes基础设施的一部分,Kubernetes管理的所有pod里,pause容器是第一个启动的,用于实现Kubernetes集群里pod之间的网络通讯

#到此为此kubeadm安装k8s集群安装完成。

卸载k8s集群

kubeadm reset -f

#卸载k8s服务

modprobe -r ipip

#Linux modprobe命令用于自动处理可载入模块。

#-r或--remove  模块闲置不用时,即自动卸载模块。

lsmod

#lsmod 命令:用来显示文件、proc/modules的信息,也就是显示当前内核模块装载的模块。

sudo systemctl stop kubelet kube-proxy flanneld kube-apiserver kube-controller-manager kube-scheduler

sudo rm -rf ~/.kube/

sudo rm -rf /etc/kubernetes/

sudo rm -rf /usr/bin/kube*

sudo rm -rf /etc/cni

sudo rm -rf /opt/cni

sudo rm -rf /var/etcd

sudo rm -rf /var/lib/etcd

sudo rm -rf /var/lib/kubelet

sudo rm -rf /var/run/Kubernetes

sudo rm -rf /var/run/flannel/

sudo rm -rf /etc/systemd/system/{etcd,kubelet,kube-apiserver,kube-controller-manager,kube-scheduler,flanneld}.service

mount | grep '/var/lib/kubelet'| awk '{print $3}'|xargs sudo umount

sudo rm -rf /root/local/bin/{etcd,kubelet,kube-apiserver,kube-controller-manager,kube-scheduler,flanneld,mk-docker-opts.sh}

sudo yum clean all

yum remove -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0

  • 17
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
KubeadmKubernetes的一个工具,用于快速部署Kubernetes集群部署Kubernetes集群的过程可以分为几个步骤: 1. 安装Kubeadm和其他Kubernetes组件,如kubelet和kubectl。你可以通过以下命令安装它们: ``` yum install -y kubeadm kubelet kubectl ``` \[2\] 2. 初始化Master节点。在Master节点上运行以下命令来初始化Kubernetes集群: ``` kubeadm init ``` 这将创建一个Kubernetes Master节点,并生成一个加入命令,你需要将这个命令保存下来,以便在后续的步骤中使用。\[1\] 3. 配置Kubernetes网络。Kubernetes需要一个网络插件来实现Pod之间的通信。你可以选择不同的网络插件,如Flannel、Calico等。根据你选择的网络插件,你需要运行相应的命令来安装和配置它。\[1\] 4. 加入Worker节点。在Worker节点上运行之前保存的加入命令,将Worker节点加入到Kubernetes集群中。这样,你就可以在集群部署和管理Pod了。\[1\] 总结起来,使用Kubeadm部署Kubernetes集群的步骤包括安装Kubeadm和其他组件、初始化Master节点、配置网络和加入Worker节点。\[1\]\[2\] #### 引用[.reference_title] - *1* *2* *3* [kubeadm部署k8s集群最全详细](https://blog.csdn.net/Doudou_Mylove/article/details/103901732)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小数苗小数苗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值