k8s安装教程
- 1 k8s介绍
- 2 环境搭建
- 2.1 主机准备
- 2.2 主机初始化
- 2.2.1 安装wget
- 2.2.2 更换yum源
- 2.2.3 常用软件安装
- 2.2.4 关闭防火墙
- 2.2.5 关闭selinux
- 2.2.6 关闭 swap
- 2.2.7 同步时间
- 2.2.8 修改Linux内核参数
- 2.2.9 配置ipvs功能
- 2.3 容器安装
- 2.3.1 设置软件yum源
- 2.3.2 安装docker软件
- 2.3.3 配置加速器
- 2.4 cri环境搭建
- 2.4.1 软件下载
- 2.4.2 安装配置
- 2.5 k8s环境安装
- 2.5.1 指定k8s源
- 2.5.2 安装kubeadm kubelet kubectl
- 2.5.3 在master节点检查镜像文件列表
- 2.5.4 在master节点上获取镜像文件
- 2.5.5 在master节点初始化
- 2.5.6 在node节点加入master节点
- 2.5.7 网络插件安装
1 k8s介绍
kubernetes,k和s直接是8个字母,简称k8s。是采用Go语言开发的。于2014年9月发布第一个版本,2015年7月发布第一个正式版本。
官网:
代码仓库:/kubernetes/kubernetes
kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能:
- 自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器
- 弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
- 服务发现:服务可以通过自动发现的形式找到它所依赖的服务
- 负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡
- 版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
- 存储编排:可以根据容器自身的需求自动创建存储卷
2 环境搭建
这里配一个一主两从的示意图
2.1 主机准备
序号 | 主机IP | 配置 | 备注 |
---|---|---|---|
1 | 192.168.123.92 | CPU:4核,内存:4G,硬盘:40GB | k8s-master |
2 | 192.168.123.93 | CPU:2核,内存:4G,硬盘:40GB | k8s-node1 |
3 | 192.168.123.94 | CPU:2核,内存:4G,硬盘:40GB | k8s-node2 |
# 序号1主机终端操作,操作完毕断开重连
hostnamectl set-hostname k8s-master
# 序号2主机终端操作,操作完毕断开重连
hostnamectl set-hostname k8s-node1
# 序号3主机终端操作,操作完毕断开重连
hostnamectl set-hostname k8s-node2
# 三台主机都需要操作:hosts解析
# vim /etc/hosts
192.168.123.92 k8s-master
192.168.123.93 k8s-node1
192.168.123.94 k8s-node2
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
2.2 主机初始化
2.2.1 安装wget
yum -y install wget
- 1
2.2.2 更换yum源
这里是CentOS7操作系统,更换成阿里yum源
# 备份
mv /etc// /etc//
# 下载镜像源
wget -c /repo/ -O /etc//
# 重新生成缓存
yum clean all && yum makecache
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
2.2.3 常用软件安装
yum -y install vim lrzsz tree
- 1
2.2.4 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
- 1
- 2
- 3
2.2.5 关闭selinux
# 临时生效
setenforce 0
- 1
- 2
# 永久生效
# vim /etc/selinux/config
# 将SELINUX=的值改成disabled,即:SELINUX=disabled
- 1
- 2
- 3
2.2.6 关闭 swap
# 临时关闭
swapoff -a
- 1
- 2
# 永久生效
# vim /etc/fstab
# 将 [/dev/mapper/centos-swap swap swap defaults 0 0] 这一行注释掉
- 1
- 2
- 3
2.2.7 同步时间
# 安装
yum -y install chrony
# vim /etc/ 注释下面内容
#server iburst
#server iburst
#server iburst
#server iburst
# 新增阿里时间服务器
server iburst
# 保存退出后,设置开机自启,重新加载配置,重启服务
systemctl enable chronyd
systemctl daemon-reload
systemctl restart chronyd
# 验证是否设置成功
# 方式一
chronyc sources
# 方式二
date
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
2.2.8 修改Linux内核参数
cat >> /etc// << EOF
# 内核参数调整
=0
# 配置iptables参数,使得流经网桥的流量也经过iptables/netfilter防火墙
-nf-call-ip6tables = 1
-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
# 配置生效,加载网桥过滤模块
modprobe br_netfilter
modprobe overlay
# 重新加载
sysctl -p /etc//
# 终端输出如下
# = 0
# -nf-call-ip6tables = 1
# -nf-call-iptables = 1
# net.ipv4.ip_forward = 1
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
2.2.9 配置ipvs功能
# 安装ipset和ipvsadm
yum install ipset ipvsadm -y
# 添加需要加载的模块写入脚本文件
cat >> /etc/sysconfig/modules/ << EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
# 为脚本文件添加执行权限
chmod +x /etc/sysconfig/modules/
# 执行脚本文件
/bin/bash /etc/sysconfig/modules/
# 查看对应的模块是否加载成功
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
# 终端输出如下
# ip_vs_sh 12688 0
# ip_vs_wrr 12697 0
# ip_vs_rr 12600 0
# ip_vs 145458 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
# nf_conntrack 139264 1 ip_vs
# libcrc32c 12644 3 xfs,ip_vs,nf_conntrack
- 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
2.3 容器安装
2.3.1 设置软件yum源
# yum-config-manager命令能用,需要安装的依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
# 新增docker阿里镜像源
yum-config-manager --add-repo /docker-ce/linux/centos/
- 1
- 2
- 3
- 4
- 5
2.3.2 安装docker软件
# 这里不指定版本,安装的是最新版docker
yum install -y docker-ce
- 1
- 2
2.3.3 配置加速器
cat >> /etc/docker/ << EOF
{
"registry-mirrors": [
""
],
# 私有仓配置
# "insecure-registries": ["域名或ip"],
"exec-opts": ["=systemd"]
}
EOF
[root@k8s-master ~]# cat /etc/docker/
{
"registry-mirrors": [
# 个人阿里云加速器配置
""
],
# 私有仓配置
# "insecure-registries": ["域名或ip"],
"exec-opts": ["=systemd"]
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
# 重启加载配置,设置开机自启并开启docker服务
systemctl daemon-reload
systemctl enable docker
systemctl start docker
- 1
- 2
- 3
- 4
2.4 cri环境搭建
2.4.1 软件下载
软件地址:/Mirantis/cri-dockerd/releases
# 这里下载的是cri最新版本
wget -c /Mirantis/cri-dockerd/releases/download/v0.3.8/cri-dockerd-0.3.8.
- 1
- 2
2.4.2 安装配置
# 解压下载文件
tar -xvf cri-dockerd-0.3.8. -C /usr/local
mv /usr/local/cri-dockerd/cri-dockerd /usr/local/bin
cri-dockerd --version
- 1
- 2
- 3
- 4
# cri-dockerd交给systemd管理的配置文件
cat > /etc/systemd/system/<<-EOF
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=
After=
Wants=
[Service]
Type=notify
ExecStart=/usr/local/bin/cri-dockerd --pod-infra-container-image=/google_containers/pause:3.9 --network-plugin=cni --cni-conf-dir=/etc/cni/ --cni-bin-dir=/opt/cni/bin --container-runtime-endpoint=unix:///var/run/ --cri-dockerd-root-directory=/var/lib/dockershim --docker-endpoint=unix:///var/run/ --
cri-dockerd-root-directory=/var/lib/docker
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=
EOF
cat > /etc/systemd/system/ <<-EOF
[Unit]
Description=CRI Docker Socket for the API
PartOf=
[Socket]
ListenStream=/var/run/
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=
EOF
- 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
# 加载配置,设置开启自启并启动服务
systemctl daemon-reload
systemctl enable cri-dockerd
systemctl start cri-dockerd
- 1
- 2
- 3
- 4
2.5 k8s环境安装
2.5.1 指定k8s源
这里使用阿里的yum源
cat > /etc// << EOF
[kubernetes]
name=Kubernetes
baseurl=/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=/kubernetes/yum/doc/
/kubernetes/yum/doc/
EOF
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
2.5.2 安装kubeadm kubelet kubectl
# 安装kubeadm kubelet kubectl
yum -y install kubeadm kubelet kubectl
# 设置kubelet开机自启和启动
systemctl enable kubelet && systemctl restart kubelet
- 1
- 2
- 3
- 4
- 5
2.5.3 在master节点检查镜像文件列表
[root@k8s-master ~]# kubeadm config images list
I1220 18:09:30.152344 26378 :256] remote version is much newer: v1.29.0; falling back to: stable-1.28
registry./kube-apiserver:v1.28.4
registry./kube-controller-manager:v1.28.4
registry./kube-scheduler:v1.28.4
registry./kube-proxy:v1.28.4
registry./pause:3.9
registry./etcd:3.5.9-0
registry./coredns/coredns:v1.10.1
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
2.5.4 在master节点上获取镜像文件
# cat
#!/usr/bin/env bash
images=$(kubeadm config images list --kubernetes-version=1.28.4 | awk -F'/' '{print $NF}')
for i in ${images}
do
docker pull /google_containers/$i
docker tag /google_containers/$i registry./$i
docker rmi /google_containers/$i
done
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
下载后一个不满足,需要再手动修改下
docker tag registry./coredns:v1.10.1 registry./coredns/coredns:v1.10.1
docker rmi registry./coredns:v1.10.1
# kubeadm config images list 和 docker images保持一致了
[root@centos ~]# kubeadm config images list
I1215 08:55:02.856427 14692 :256] remote version is much newer: v1.29.0; falling back to: stable-1.28
registry./kube-apiserver:v1.28.4
registry./kube-controller-manager:v1.28.4
registry./kube-scheduler:v1.28.4
registry./kube-proxy:v1.28.4
registry./pause:3.9
registry./etcd:3.5.9-0
registry./coredns/coredns:v1.10.1
[root@centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry./kube-apiserver v1.28.4 7fe0e6f37db3 4 weeks ago 126MB
registry./kube-controller-manager v1.28.4 d058aa5ab969 4 weeks ago 122MB
registry./kube-scheduler v1.28.4 e3db313c6dbc 4 weeks ago 60.1MB
registry./kube-proxy v1.28.4 83f6cc407eed 4 weeks ago 73.2MB
registry./etcd 3.5.9-0 73deb9a3f702 7 months ago 294MB
registry./coredns/coredns v1.10.1 ead0a4a53df8 10 months ago 53.6MB
registry./pause 3.9 e6f181688397 14 months ago 744kB
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
2.5.5 在master节点初始化
# 直接初始化
kubeadm init --kubernetes-version=1.28.4 \
--node-name=k8s-master \
--apiserver-advertise-address=192.168.123.92 \
--image-repository registry. \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket=unix:///var/run/
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
# 重置并初始化
kubeadm reset -f --cri-socket=unix:///var/run/ && kubeadm init --kubernetes-version=1.28.4 \
--node-name=k8s-master \
--apiserver-advertise-address=192.168.123.92 \
--image-repository /google_containers \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket=unix:///var/run/
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
master节点初始化成功,终端显示
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/ $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
/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.123.92:6443 --token jy6fvz.3zf24v9sb5f4dto2 \
--discovery-token-ca-cert-hash sha256:d0d61ece9c05b8ffcc4b246dfedf139dab7a701618e11621934575844216aee4
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
跟进终端提示,主节点操作
mkdir -p $HOME/.kube && cp -i /etc/kubernetes/ $HOME/.kube/config && chown $(id -u):$(id -g) $HOME/.kube/config
- 1
2.5.6 在node节点加入master节点
node节点加入主节点,在其node节点运行
# 直接加入
kubeadm join 192.168.123.92:6443 --token jy6fvz.3zf24v9sb5f4dto2 \
--discovery-token-ca-cert-hash sha256:d0d61ece9c05b8ffcc4b246dfedf139dab7a701618e11621934575844216aee4 \
--cri-socket=unix:///var/run/
- 1
- 2
- 3
- 4
# 重置并加入
kubeadm reset -f --cri-socket=unix:///var/run/ && kubeadm join 192.168.123.92:6443 --token jy6fvz.3zf24v9sb5f4dto2 \
--discovery-token-ca-cert-hash sha256:d0d61ece9c05b8ffcc4b246dfedf139dab7a701618e11621934575844216aee4 \
--cri-socket=unix:///var/run/
- 1
- 2
- 3
- 4
重新生成加入节点token
kubeadm token create --print-join-command
- 1
设置kubectl命令可以在node节点操作
scp -r $HOME/.kube 192.168.123.93:$HOME/
- 1
至此kubeadm命令工作完成,kubectl命令开始工作
2.5.7 网络插件安装
只在master节点操作即可
安装网络插件kube-flannel
# 打开https://site./网站查询网址的域名解析,然后配置到/etc/hosts
#
# 用wget命令下载文件
wget --no-check-certificat /coreos/flannel/master/Documentation/
# 主节点执行
kubectl apply -f
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
安装网络插件calico
官方网址:/
# 打开https://site./网站查询网址的域名解析,然后配置到/etc/hosts
# 下载
# /calico/latest/getting-started/kubernetes/self-managed-onprem/onpremises
wget --no-check-certificat /projectcalico/calico/v3.27.0/manifests/
# 官方提供的yaml文件中,ip识别策略(IPDETECTMETHOD)没有配置,即默认为first-found,这会导致一个网络异常的ip作为nodeIP被注册,从而影响node-to-nodemesh。
# 解决方法
vim
:/CLUSTER_TYPE
# 在下添加:
- name: IP_AUTODETECTION_METHOD
value: "interface=ens192" # 192为Linux执行ip a或ifconfig的名称
# 验证
kubectl get po -n kube-system
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
至此,k8s最新版集群环境搭建完毕