kubernetes系列:✈️k8s集群搭建(收藏篇)
1.前置环境
⭐注:该章节所有命令在所有机器
操作
1.1 三台互通的机器
- 虚拟机搭建可以参考我之前写的一篇文章:环境篇:Virtualbox+Vagrant安装Centos7
- 参考这篇文章配置hosts文件,使得集群内机器可以使用主机名访问:都上集群了,你还在一个个手动上传文件!分发大法:scp,rsync,xsync-plus
1.2 linux版本检查
- 此方式下安装kubernetes集群要求Centos版本要在7.5或之上:
cat /etc/redhat-release
1.3 主机名检查
- 如果是vagrant启动的,那其实在vagrantFile中已经配置过了,在这里无需重复配置
- 查看主机名:
hostnamectl
- 修改主机名:
hostnamectl set-hostname <hostname>
- 查看主机名:
1.4. 同步机器时间
-
kubernetes要求集群中的节点时间必须精确一致,这里直接使用chronyd服务从网络同步时间。企业中建议配置内部的时间同步服务器
-
安装时间同步插件:
yum install -y ntpdate
-
查看时间:
timedatectl
-
修改时间为上海:
timedatectl set-timezone Asia/Shanghai
-
修改同步服务器地址为阿里云:
sed -i.bak '3,6d' /etc/chrony.conf && sed -i '3cserver ntp1.aliyun.com iburst' /etc/chrony.conf
-
启动chronyd及加入开机自启:
systemctl start chronyd && systemctl enable chronyd
-
查看同步结果:
chronyc sources
-
为了检查chrony是否同步:
chronyc tracking
1.5 禁用iptables和firewalld服务
- kubernetes和docker在运行中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则
- 关闭firewalld服务
systemctl stop firewalld
systemctl disable firewalld
- 关闭iptables服务(在CentOS7以上,防火墙的管理由firewalld来管理)
systemctl stop iptables
systemctl disable iptables
1.6 禁用selinux
- selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题
- 禁用selinux
- 临时有效:
sudo setenforce 0
- 永久有效(选这个):编辑/etc/selinux/config 文件,
修改SELINUX的值为disabled
(要重启
):vi /etc/selinux/config
- 临时有效:
1.7 禁用swap分区
- swap分区指的是虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间虚拟成内存来使用
- 启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备
- 但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明
- 禁用
- 临时有效:
swapoff -a
- 永久有效(选这个):
echo "vm.swappiness=0" >> /etc/sysctl.conf
sysctl -p /etc/sysctl.conf
- 修改分区配置文件,注释掉swap分区一行(
要重启
):vi /etc/fstab
- 临时有效:
1.8 配置linux的内核参数
- 添加网桥过滤和地址转发功能,编辑/etc/sysctl.d/kubernetes.conf文件,添加如下配置:
sudo vi /etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
- 重新加载配置,加载网桥过滤模块:
modprobe br_netfilter && sysctl -p /etc/sysctl.d/kubernetes.conf
- 查看网桥过滤模块是否加载成功 :
lsmod | grep br_netfilter
1.9 配置ipvs功能
- 在kubernetes中service有两种代理模型:
- 是基于
ipvs
(选这个):- ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块
- 1.安装ipset和ipvsadm :
yum install ipset ipvsadmin -y
- 2 添加需要加载的模块写入脚本文件:
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
- 3 为脚本文件添加执行权限:
chmod +x /etc/sysconfig/modules/ipvs.modules
- 4 执行脚本文件:
/bin/bash /etc/sysconfig/modules/ipvs.modules
- 5 查看对应的模块是否加载成功:
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
- 基于
iptables
:-
也有配置iptables的,将桥接的 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 -p
-
1.10 安装ipvsadm
yum -y install ipset ipvsadm
1.11 重启服务器
- 上面步骤完成之后,需要重新启动linux系统:
reboot
2. 安装docker
-
注:该章节所有命令在
所有机器
操作 -
k8s基于docker容器环境,先安装docker:应用容器引擎Docker(一):Docker安装
-
docker要设置开机启动
-
由于k8s官方文档中指出使用cgroupfs管理docker和k8s资源,同时使用systemd管理节点上其他进程资源在服务器资源压力大时会出现不稳定,因此推荐
修改docker和k8s统一使用systemd
:sed -i.bak "s#^ExecStart=/usr/bin/dockerd.*#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd#g" /usr/lib/systemd/system/docker.service
-
重启docker使配置生效
- systemctl daemon-reload
- systemctl restart docker
- systemctl status docker
3. 设置kubernetes仓库,配置阿里云yum源
- 注:该章节所有命令在
所有机器
操作 - 配置阿里云的yum源告诉k8s在哪里加速下载安装
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[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
刷新缓存:
yum makecache fast
4.安装kubeadm,kubelet,kubectl
- kubeadm组件可以安装k8s的主节点和使从节点加入集群
- kubelet组件管理每个node节点,代理并管理pods等
- kubectl组件是一个命令行工具,可以只安装在master节点即可。
4.1查询版本
yum list|grep kube
或
yum --showduplicates list kubelet
安装指定版本格式:
yum install -y [package-name]-[version_number]
4.2安装指定版本
- 注:该章节所有命令在
所有机器
操作
- 安装:
yum install -y kubelet-1.22.4 kubeadm-1.22.4 kubectl-1.22.4
- 开机启动:
systemctl enable kubelet && systemctl start kubelet
(此时还是activating状态不用管) - 查看版本:
kubelet --version
5. 部署k8s
5.1集群规划
查看hosts配置:cat /etc/hosts
主机名 | ip | 角色 | 安装组件 |
---|---|---|---|
k8s1 | 10.0.2.9 | master | master组件,etcd,kubelet,kubectl |
k8s2 | 10.0.2.8 | worker | worker组件, kubelet |
k8s3 | 10.0.2.15 | worker | worker组件, kubelet |
注:内存每台至少4G
5.2初始化mater节点
5.2.1 先下载初始化kubeadm需要的相关镜像
注:本节命令请在master节点操作
-
查看master的默认网卡ip:
ip route show
或ip addr
的eth0网卡ip -
先下载初始化kubeadm需要的相关镜像,不然执行kubeadm init 命令下载很久,也不知道下载到哪里
-
由于官方镜像地址被墙,所以我们需要首先获取所需镜像以及它们的版本。然后从国内镜像站获取。查看指定版本需要镜像版本:
kubeadm config images list --kubernetes-version=v1.22.4
-
编写下载镜像脚本,版本参考上面命令:
mkdir /app/k8s
vi /app/k8s/master_images.sh
#!/bin/bash
## 下面的镜像应该去除"k8s.gcr.io/"的前缀,版本换成上面获取到的版本
images=(
kube-apiserver:v1.22.4
kube-proxy:v1.22.4
kube-controller-manager:v1.22.4
kube-scheduler:v1.22.4
coredns:v1.8.4
etcd:3.5.0-0
pause:3.5
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
#下面是默认外国源,下载慢
# docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
done
- 如果要查看阿里云镜像有没有这个版本,可以登录查看搜索:阿里云容器镜像服务 (aliyun.com)
- 脚本权限:
chmod +x /app/k8s/master_images.sh
- 执行下载镜像:
./master_images.sh
- 查看下载的镜像:
docker images
5.2.2 初始化kubeadm
由于上面已经从阿里云仓库下载了所需镜像,下面执行初始化命令就不会去国外下载镜像了。在master节点执行
kubeadm init \
--apiserver-advertise-address=10.0.2.9 \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version v1.22.4 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16
- apiserver-advertise-address:apiserver地址填写要当master机器ip(
修改自己的mater的ip
) - image-repository:由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。可以手动按照我们的/app/k8s/master_images.sh先拉取镜像,在配置--image-repository属性就可以用到我们刚才下载好的镜像。地址变为 registry.aliyuncs.com/google_containers 也可以,省去上面5.2.2一步骤(但是初始化命令可能等很久,要下载镜像,所有分开两步骤,确保需要的镜像已经下载)。(不用改)
- kubernetes-version:指定版本要和安装时一致即可(
修改自己的版本
) - service-cidr:设置由pods组成的services通信ip段的子网(不用改)
- pod-network-cidr:pods的通信ip段的子网(不用改)
- 科普:无类别域间路由(Classless Inter-Domain Routing、CIDR)是一个用于给用户分配IP地址以及在互联网上有效地路由 IP 数据包的对 IP 地址进行归类的方法。
问题: 出现该问题请关闭集群的虚拟内存交换
[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
[ERROR Swap]: running with swap on is not supported. Please disable swap
运行结果:
翻译:
要开始使用你的集群,你需要运行以下作为一个普通用户:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
或者,如果你是根用户,你可以运行:
export KUBECONFIG=/etc/kubernetes/admin.conf
您现在应该将一个pod网络部署到集群。
执行"kubectl apply -f [podnetwork].yaml",其中一个选项列在:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
然后你可以通过在每个worker节点上运行以下命令来加入任意数量的worker节点:
kubeadm join 10.0.2.9:6443 --token gp34b0.p7258upebcqb7zy3 \
--discovery-token-ca-cert-hash sha256:7435c7011942ad6a754c743218ee5f1cd4ea2842305c3aa3b75666008af567fb
安装要求执行相关命令即可:
- 当前master节点执行:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
- pod网络部署到集群,这里选择flannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
由于kube-flannel.yml这个文件可能被墙,下载不了,我已放到码云: gitee下载
- 在master节点上执行安装POD网络插件:
kubectl apply -f /app/k8s/kube-flannel.yml
- 如果想删除该插件可把apply命令改成delete即可
5.3 worker节点加入集群
- master节点获取名称空间:
kubectl get ns
- master节点查看所有命名空间下所有pods:
kubectl get pods --all-namespaces
- master节点查看集群节点:
kubectl get nodes
- 等待master节点状态为
Ready
,flannel状态为Running
。再在每个worder节点执行join命令加入集群(该命令有时间限制,过期会失效)
worker
节点执行:
kubeadm join 10.0.2.9:6443 --token gp34b0.p7258upebcqb7zy3 \ --discovery-token-ca-cert-hash sha256:7435c7011942ad6a754c743218ee5f1cd4ea2842305c3aa3b75666008af567fb
- 再次检查是否已经加入到集群节点:
kubectl get nodes
- 如果worker节点状态为NotReady,监控 pod 进度等3-10分钟:
watch kubectl get pod -n kube-system -o wide
。等待pod变为Running状态 - 如果网络出现问题,关闭 cni0,重启虚拟机继续测试:
ip link set cni0 down
- 如果出现下面内容,k8s搭建完成
5.3.1 join命令令牌过期
- master节点打印一个临时token:
kubeadm token create --print-join-command
- master节点打印一个不过期token:
kubeadm token create --ttl 0 --print-join-command
5,4部署Tomcat检验
注:在master上执行命令
- 部署一个tomcat
kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8
- 暴露nginx访问
-
kubectl expose deployment tomcat6 --port=80 --target-port=8080 --type=NodePort
- --type=NodePort :为service随机分配端口映射到pod的80,pod的80再映射到容器tomcat的8080
- 查看全部信息
kubectl get all -o wide
- 访问
- 仅主机网络ip(192.168.56.101/103)+端口(32285):192.168.56.101:32285
- 验证成功可删除tomcat部署和服务
kubectl delete deployment.apps/tomcat6
kubectl delete service/tomcat6
6. 一键安装kubernetes+kubeshere
6.1 KubeKey 环境安装
- 只需要
1.前置环境
和2.安装docker
两个步骤,再执行下面的操作,KubeKey会帮我们一键安装kubernetes和kubesphere。
- 环境安装
yum install -y ebtables socat ipset conntrack
- 先执行以下命令以确保您从正确的区域下载 KubeKey。
export KKZONE=cn
- 执行以下命令下载 KubeKey:
curl -sfL https://get-kk.kubesphere.io | VERSION=v1.2.0 sh -
- 查看kubeshere支持的版本
./kk version --show-supported-k8s
6.2kubeshere 安装
这里要指定版本安装,就算安装最新版也要把版本号写上,不然会有问题。下面命令运行生成yaml文件
./kk create config --with-kubernetes v1.18.6 --with-kubesphere v3.0.0
修改为自己的配置值:
开始安装:
./kk create cluster -f config-sample.yaml
如果下载不了helm,一直卡在那里,查看/app/k8s/kubekey/v1.21.5/amd64/路径下下载的文件大小,文件大小没有变就是卡在那里了,这时拔网线,会弹出错误,在根据这个错误用迅雷去下载
错误如下:
Failed to download kube binaries: Failed to download helm binary: curl -L -o /app/k8s/kubekey/v1.21.5/amd64/helm-v3.6.3-linux-amd64.tar.gz https://get.helm.sh/helm-v3.6.3-linux-amd64.tar.gz && cd /app/k8s/kubekey/v1.21.5/amd64 && tar -zxf helm-v3.6.3-linux-amd64.tar.gz && mv linux-amd64/helm . && rm -rf *linux-amd64*
下载好插件放到提示的路径下,/app/k8s/kubekey/v1.21.5/amd64/,并执行提示的命令:
cd /app/k8s/kubekey/v1.21.5/amd64 && tar -zxf helm-v3.6.3-linux-amd64.tar.gz && mv linux-amd64/helm . && rm -rf *linux-amd64*
这时重新运行安装命令,会跳过helm下载。其他组件下载慢也可用该方法
安装过程,也可查看日志:
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f
6.3 卸载kubernetes+kubeshere
把刚才的部署文件再用delete命令就是卸载了
./kk delete cluster [-f config-sample.yaml]
6.4kubesphere启用可插拔组件
安装过程:
- 以
admin
身份登录控制台,点击左上角的平台管理,选择集群管理。 - 点击 CRD,在搜索栏中输入
clusterconfiguration
,点击结果查看其详细页面。 - 在自定义资源中,点击
ks-installer
右侧的 !选择编辑 YAML。 - 在该 YAML 文件中,搜寻到
openpitrix
,将enabled
的false
改为true
。完成后,点击右下角的更新,保存配置。
查看安装过程:
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f
如果没有开启防火墙,kubeshere需要的端口列表,可以单独为需要端口开放配置:Port Requirements (kubesphere.io)
- 👍🏻:有收获的,点赞鼓励!
- ❤️:收藏文章,方便回看!
- 💬:评论交流,互相进步!
转载自:https://juejin.cn/post/7042907905741291533