基础
本文主要讲解使用kubeadm搭建高可用的集群,这种方式是最简单最快的。
安装步骤
我们安装k8s的机器资源条件如下:
- centos7.7
- 内存不低于2G,CPU不少于2核,否则在安装的时候会报错
- 集群中的所有机器都要保证网络连通性
- 相关端口开放
- swap关闭
-
更新系统
在开始安装服务之前,我们先更新一下yum源,然后安装相关的软件
1
2
3
4
5更新yum源
yum update
安装git(可选)
yum install git -
禁用swap分区
1
2
3
4
5关闭swap分区,该命令只是临时关闭,机器重启后还会自动打开
swapoff -a
永久性关闭swap分区,禁止机器重启后自动打开
sed -i '/ swap / s/^/#/' /etc/fstab -
更换yum源为国内镜像
centos的yum源默认为国外的,如果你的服务器是在国内,那么可能访问不了,所以我们需要把yum的源更换为国内的
1
2
3
4
5
6这里有一个注意点,就是下面的Centos-7.repo,这里因为我们使用的centos7,如果你的系统是centos8,那么就改成Centos-8.repo,也就是改成相对应的版本,否则yum安装不了软件
cd /etc/yum.repos.d && \
sudo mv CentOS-Base.repo CentOS-Base.repo.bak && \
sudo wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \
yum clean all && \
yum makecache -
安装docker环境
k8s内部可以支持多种容器,我们最常使用的就是docker,所以我们这里也以docker为基础
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41安装docker依赖包
yum install yum-utils device-mapper-persistent-data lvm2
添加docker库
yum-config-manager --add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
更新源
yum update
安装docker
yum install containerd.io-1.2.10 \
docker-ce-19.03.4 \
docker-ce-cli-19.03.4
配置docker daemon
mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
EOF
创建docker.service.d
mkdir -p /etc/systemd/system/docker.service.d
启用docker.service
systemctl enable docker.service
重载&重启docker
systemctl daemon-reload
systemctl restart docker安装完之后使用docker -v查看版本
-
更换docker为国内源
1
2
3
4
5
6
7
8
9配置
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF
重启docker
service docker restart -
安装kubeadm、kubelet、和kubectl
kubeadm 负责引导集群,kubelet 在集群的所有节点运行,负责启动 pods 和 containers,kubectl 则负责与集群交互,我们需要在所有节点安装这些组件
-
配置k8s国内源
我们把k8s的源修改为阿里云的
1
2
3
4
5
6
7
8
9
10
11配置国内源
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 -
关闭SELinux
1
2setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config -
配置网络参数
1
2
3
4
5
6
7
8
9cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
确保 br_netfilter 模块已经加载
modprobe br_netfilter -
安装并启动kubeadm、kubelet、和kubectl
1
2
3
4
5安装
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
启动
systemctl enable --now kubelet
-
-
使用kubeadm初始化集群
因为我的服务器在国内,且由于 kubeadm 初始化集群的依赖镜像在国内访问不了,所以初始化集群之前先使用国内源拉取依赖镜像
-
拉取依赖镜像
1
2
3
4
5
6
7
8
9
10
11获取依赖镜像列表
kubeadm config images list
使用阿里源下载 K8s 依赖镜像
kubeadm config images list |sed -e 's/^/docker pull /g' -e 's#k8s.gcr.io#registry.cn-hangzhou.aliyuncs.com/google_containers#g' |sh -x
通过docker tag修改镜像与国外镜像名称相同,这样的目的是在初始化的时候,docker会先在本地查找,若本地已有镜像则不会再去远程拉取,等于来了一招瞒天过海
docker images |grep registry.cn-hangzhou.aliyuncs.com/google_containers |awk '{print "docker tag ",$1":"$2,$1":"$2}' |sed -e 's#registry.cn-hangzhou.aliyuncs.com/google_containers#k8s.gcr.io#2' |sh -x
删除原镜像,这个可选
docker images |grep registry.cn-hangzhou.aliyuncs.com/google_containers |awk '{print "docker rmi ", $1":"$2}' |sh -x -
master节点初始化
我们使用kubeadm init指令初始化master节点,具体的参数可参考官方文档:https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-init/
1
2local_ip是本机局域网ip,kubectl_version是我们镜像的版本
kubeadm init --apiserver-advertise-address=<local_ip> --kubernetes-version=<kubectl_version> --pod-network-cidr=10.244.0.0/16 --v=5执行成功之后,日志会打印出下面语句,并且会告知我们节点加入的方式
1
2
3
4root或非root用户均可执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config或
1
export KUBECONFIG=/etc/kubernetes/admin.conf
-
开启使用master节点资源
默认master节点是不参与pod调度的,这样对于master节点的资源来说有点太过浪费,所以我们通过下面的命令使master节点也参与pod调度
1
kubectl taint nodes --all node-role.kubernetes.io/master-
-
-
添加网络组件
我们通过kubectl get nodes查看集群内的节点,当前应该只有master一个节点,但是节点的状态为NotReady,查看coredns的pod(kubectl get pod --all-namespaces),会发现coredns处于pending状态,原因就是我们还未安装网络组件。
1
2网络组件我们选择WeaveNet,安装完之后稍等一会就可以了
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')" -
向集群中添加node节点
每一台node都需要操作从1~6的步骤,然后我们使用kubeadm join来添加到集群中,这里的token是在master节点创建的,我们可以使用
kubeadm token list
命令查看可用的token,如果没有可用的token,那么我们使用kubeadm token create
创建新的token,一个token的有效期为24小时1
2kubeadm join 192.168.0.54:6443 --token 9dmyq2.c50cvh32r62o6jlx \
--discovery-token-ca-cert-hash sha256:4640dd5d3788968d86ce3cb792c1e368586ee6731de5a07ad8ad331926a2f233 -
验证
加入之后我们在master节点通过
kubectl get nodes
来查看所有的节点,验证是否加入成功。