k8s单master集群在线安装
新手安装k8s集群的详细步骤
说明:此文章基于对k8s集群相关组件已有一定了解,此安装方式采用的是k8s官方安装工具kubeadm安装,并且安装机器基于红帽系系统centos 7 版本为例,本教程安装为docker的19.03.9,k8s的1.19.0版本
k8s高可用多master集群安装请参考我的下一篇博文
k8s多master集群在线安装_玖〇后大叔的博客-CSDN博客
假设我们有三台机器host-01,host-02,host-03,内网ip为192.168.0.1,192.168.0.2,192.168.0.3
规划为host-01为集群master机器,host-02,host-03为集群node机器
1. 分别设置三台机器/etc/hosts文件,加入三台机器的ip映射
192.168.0.1 host-01
192.168.0.2 host-02
192.168.0.3 host-03
2. 禁用系统的交换空间(kubelet启动会检查是否启动了交换空间,如有会启动报错)
swapoff -a
3.添加阿里外网yum基础安装源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
执行 yum clean all && yum repolist 缓存安装源信息
4.安装基础软件
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vimnet-tools git iptables-services
5. 关闭防火墙以及启动iptables服务
systemctl disable firewalld --now && systemctl enable iptables && iptables -F && service iptables save
6.关闭selinux
临时关闭:setenforce 0
永久关闭:编辑/etc/selinux/config文件,修改SELINUX为disabled
7. 设置系统内核参数
cat > /etc/sysctl.d/kubernetes.conf << EOF
net.bridge.bridge-nf-call-iptables=1 #ipv4流量转给iptable链
net.bridge.bridge-nf-call-ip6tables=1 #ipv6流量转给iptable链
net.ipv4.ip_forward=1 #开启内核路由转发
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
vm.overcommit_memory=1 # 不检查物理内存是否够用
vm.panic_on_oom=0 # 开启 OOM
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
执行 sysctl -p /etc/sysctl.d/kubernetes.conf 使参数生效
8. 调整系统时区
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
如果对时间同步有更高要求可配置阿里ntp 服务器,步骤如下:
(1)yum install -t ntpdate
(2)ntpdate ntp.aliyun.com
(3)编辑定时任务每五分钟进行一次时间同步
crontab -e
*/5 * * * * /usr/sbin/ntpdate ntp.aliyun.com >> /var/log/ntpdate.log
9. 打开内核ipvs相关模块
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
10. 安装docker(在线安装和离线安装)
注意docker安装版本和k8s版本之间依赖关系可从k8s开源仓库如下位置获取,以为k8s1.9版本为例
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.9.md#external-dependencies
在线安装:
(1)安装一些必要的系统工具
yum install -y yum-utils device-mapper-persistent-data lvm2
(2)添加阿里docker安装yum源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
(3)修改yum源配置文件中相关地址(阿里更换了地址)
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
(4)更新yum源并且执行安装docker
yum makecache fast
查看yum源中docker引擎的版本,选择需要安装的版本
yum list docker-ce.x86_64 --showduplicates | sort -r
注意:docker的安装基于系统底层cpu架构,如果选定版本安装,需明确系统的cpu架构,可执行arch命令查看,如果为arm64架构,查看yum源中docker引擎的版本,应该为 yum list docker-ce.arm64 --showduplicates | sort -r,当我们不安装指定版本docker直接yum install -y docker-ce 会安装最新的版本的docker,并且yum源配置文件中可以利用yum获取到系统cpu架构并安装正确
查看版本输出如下:
Loading mirror speeds from cached hostfile
Loaded plugins: branch, fastestmirror, langpacks
docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable
docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
安装指定版本: yum install -y docker-ce-19.03.9.ce-1.el7.centos
(5)启动docker服务
systemctl enable docker --now
离线安装:
(1)docker官网下载离线安装包,同样注意系统的cpu架构,下载相应的安装包
https://download.docker.com/linux/static/stable/x86_64/docker-19.03.9.tgz
https://download.docker.com/linux/static/stable/aarch64/docker-19.03.9.tgz
将安装宝上传至服务器 解压 tar -zxvf docker-19.03.9.tgz 会得到一个docker目录,将docker目录下的二进制文件移动至系统PATH环境变量目录下,例如
mv docker/* /usr/bin
(2) 编辑系统systemd docker服务管理文件
vi /etc/systemd/system/docker.service 内容如下
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
#注意此更换为实际移动目录
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
(3)启动docker服务
systemctl enable docker --now
11. 修改docker配置,重启docker服务
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"graph":"/data/docker", 注意磁盘划分,设置docker家目录,默认在/var/lib/docker目录
"log-opts": {
"max-size": "100m"
}
}
重启docker服务:
systemctl daemon-reload && systemctl restart docker
检查配置是否生效:
docker version
docker info
12. 安装kubeadm kubectl 以及kubelet,此三个组件版本最好一致,可以选择具体版本安装,注意和docker的版本依赖
添加阿里安装源:
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
执行yum repolist 缓存仓库包信息
查看已有版本信息:
yum list kubeadm --showduplicates | sort -n
安装指定版本:
yum -y install kubeadm-1.19.1 kubectl-1.19.1 kubelet-1.19.1(可以更换版本)
注:如何更换kubeadm版本
yum list installed | grep kube
yum remove kubeadm kubectl kubelet -y
yum install -y kubelet-1.19.1 kubeadm-1.19.1 kubectl-1.19.1(版本随意)
将 Container Runtime、kubelet 配置成使用 systemd 来作为 cgroup 驱动
修改 /etc/sysconfig/kubelet 文件的KUBELET_EXTRA_ARGS参数
#vi /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS=--cgroup-driver=systemd
启动kubelet服务:
systemctl enable kubelet --now
以上步骤在三台机器都需执行,至此安装k8s集群的前置条件已经具备,下面安装k8s集群
1. 在master node-01 生成安装集群的配置文件
kubeadm config print init-defaults > kubeadm-config.yaml
2. 修改相关配置项
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.0.205 主节点ip
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: node-01 此处可以设置为hostname,生成配置文件kubeadm会识别hostname,并且填充此处
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /data/etcd etcd数据目录,默认为生成为/var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers 安装集群拉去镜像的镜像仓库,改为阿里国内镜像仓库,阿里仓库同步的谷歌仓库,国内仓库下载速度较快
kind: ClusterConfiguration
kubernetesVersion: v1.19.0 集群版本和kubectl在同一个大版本下的小版本最好前后不要相差2个小版本,比如kubectl 安装的为1.19.0,此处最大可为1.19.1,防止后续有一些不兼容的地方,k8s官方文档有说明
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12 service网段地址,注意和已有内网网段区分
podSubnet: 10.244.0.0/16 pod地址网段,注意和已有内网网段区分
scheduler: {}
#####以下内容配置文件中没有,如果service到集群pod的负载均衡配制成走内核ipvs,可添加如下配置,默认走的iptable负载均衡
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
SupportIPVSProxyMode: true
mode: ipvs
3. 预先下载镜像
查看需要下载的镜像列表:
kubeadm config images list --config kubeadm-config.yaml
查看其他k8s版本需要下载的镜像列表:
kubeadm config images list --kubernetes-version=v1.22.1
k8s.gcr.io/kube-apiserver:v1.22.1
k8s.gcr.io/kube-controller-manager:v1.22.1 一般只有以上这四个镜像版本会跟随k8s 版本变更
k8s.gcr.io/kube-scheduler:v1.22.1
k8s.gcr.io/kube-proxy:v1.22.1
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.13-0
k8s.gcr.io/coredns:1.7.0
预先下载镜像:
kubeadm config images pull --config kubeadm-config.yaml
4. 初始化主节点
kubeadm init --config=kubeadm-config.yaml | tee kubeadm-init.log
注意观察屏幕的安装日志,初始化成功后注意屏幕输出信息:
(1).会显示如下的信息 按步执行,这样kubectl工具便可以操作集群和查看集群信息了
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown ( i d − u ) : (id -u): (id−u):(id -g) $HOME/.kube/config
(2).会显示加入到master的命令,保存下来,拿到node-02,node-03节点执行
kubeadm join 192.168.137.10:6443 --token abcdef.0123456789abcdef
–discovery-token-ca-cert-hash sha256:028fc1e2a324415e0c96895c1f5d74b91c61576c2bc574fe4199d531de3a46cd
master节点和node节点都执行成功后在master分别执行:
kubectl get nodes
kubectl get pods -n kube-system -o wide
会发现所有节点的状态都是NotReady,同时coredns pod运行状态为pending 因为没有安装网络插件,集群之间的node没法相互通信
注:如果在node节点也需要使用kubectl来操作集群,只需要将master的kubectl使用的配置文件/root/.kube/config scp至node节点相对应位置(为用户的$HOME/.kube/config)即可
5.安装网络插件
k8s集群的网络插件官方不提供,均为第三方开发并且开源,我们这里选用flannel插件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
执行安装网络插件
kubectl apply -f kube-flannel.yaml 注意如果pod ip网段更换,文件中网段也需要更换,否则k8s集群中的pod 无法出网与外界通信
等待k8s 把 pod:flannel生效 可以用命令查看状态进度:
kubectl get pods -n kube-system
等待所有组件显示running后,执行kubectl get node,显示所有node均为ready后,那么恭喜你,你的集群安装成功了
更多推荐
所有评论(0)