🙊k8s玩耍环境搭建(CentOS Stream release 8 + k8s v1.22.4)
一直想自己搭建一个自己玩耍,但又由于没有足够资源的服务器:weary:,一直迟迟未操作。
😈终于,十一假期在老家添置了一台垃圾佬配置DELL R720xd,废话少说,开整🌙
1️⃣准备几台机子💻
这里准备的配置是(2h+4G+80G),应该勉强够玩,不够了再ESXI添配置

2️⃣网络等基础配置设置
分别设置,三台机子给个名字
1
2
3hostnamectl set-hostname c1
hostnamectl set-hostname c2
hostnamectl set-hostname c3设置静态ip,分别执行(注意修改ip,设置静态ip,PEERDNS=no且ipv6的autoconfig设置为no为防止重启后dns配置丢失[不设置后面会有坑,k8s的dns解析不了东西])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18sed -i 's/BOOTPROTO=dhcp/BOOTPROTO=static/g' /etc/sysconfig/network-scripts/ifcfg-ens192
echo '
IPADDR=192.168.0.31
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
PEERDNS=no
' >> /etc/sysconfig/network-scripts/ifcfg-ens192
echo '
nameserver 114.114.114.114
nameserver 8.8.8.8
nameserver 8.8.4.4
nameserver 1.1.1.1
' >> /etc/resolv.conf
echo '
192.168.0.31 c1
192.168.0.32 c2
192.168.0.33 c3
' >> /etc/hostsssh免密,分别执行
1
2
3
4ssh-keygen -t rsa
ssh-copy-id -i /root/.ssh/id_rsa.pub c1
ssh-copy-id -i /root/.ssh/id_rsa.pub c2
ssh-copy-id -i /root/.ssh/id_rsa.pub c3关闭防🔥墙
1
systemctl disable --now firewalld
前置设置(关闭swap、selinux,设置几个内核参数,加载br_netfilter模块)
1
2
3
4
5
6
7
8
9
10
11setenforce 0 && swapoff -a && sed -i 's/.*swap.*/#&/' /etc/fstab
systemctl stop firewalld && systemctl disable firewalld
sysctl net.bridge.bridge-nf-call-iptables=1
sysctl net.bridge.bridge-nf-call-ip6tables=1
sysctl vm.max_map_count=262144
modprobe br_netfilter && sysctl -p
#简单指令换一下,个人喜好,可忽略
ln -s /bin/clear /bin/cls
#yum那句没中文的报错内容是太难受了
echo "export LC_ALL=en_US.UTF-8" >> /etc/profile && source /etc/profile3️⃣install docker
建议直接按照文档走👉dokcer docs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
yum install -y yum-utils && yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io
sudo mkdir -p /etc/docker
#添加自己的阿里云镜像加速地址
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://********.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl enable --now docker4️⃣安装k8s
添加yum源,如果服务器可以直接外网🇨🇳,可使用k8s官网上的配置👉k8s docs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum update
yum clean packages
yum install -y kubelet-1.22.4
yum install -y kubeadm-1.22.4
yum install -y kubectl-1.22.4
systemctl enable --now kubelet插播一个设置,时钟同步
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15cat <<EOF | tee /etc/chrony.conf
server ntp.aliyun.com iburst
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
server ntp3.aliyun.com iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
keyfile /etc/chrony.keys
leapsectz right/UTC
logdir /var/log/chrony
EOF
timedatectl set-timezone Asia/Shanghai
systemctl enable --now chronyd
reboot
💔问题来了,kubelet起不来,看看状态🔍
1
2
3
4
5
6systemctl status kubelet
[root@c1 ~]# systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
Drop-In: /usr/lib/systemd/system/kubelet.service.d
└─10-kubeadm.conf编辑Drop-In中指向的文件,指定kubelet的cgroup driver,保持和docker的一致
1
2
3
4
5
6
7
8
9
10
11vi /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
[Service]后面添加
Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=cgroupfs"
最后参数添加
$KUBELET_CGROUP_ARGS
然后
vi /etc/sysconfig/kubelet
追加
--fail-swap-on=false
#重启kubelet
systemctl daemon-reload && systemctl restart kubelet5️⃣kubeadm初始化集群
指定一些参数
1
2
3
4
5
6
7kubeadm init \
--kubernetes-version=1.22.4 \
--image-repository registry.aliyuncs.com/google_containers \
--apiserver-advertise-address=192.168.0.31 \
--pod-network-cidr=10.10.0.0/16 \
--service-cidr=10.20.0.0/16 \
--token-ttl=0参数描述👇
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23--apiserver-advertise-address string 设置 apiserver 绑定的 IP.
--apiserver-bind-port int32 设置apiserver 监听的端口. (默认 6443)
--apiserver-cert-extra-sans strings api证书中指定额外的Subject Alternative Names (SANs) 可以是IP 也可以是DNS名称。 证书是和SAN绑定的。
--cert-dir string 证书存放的目录 (默认 "/etc/kubernetes/pki")
--certificate-key string kubeadm-cert secret 中 用于加密 control-plane 证书的key
--config string kubeadm 配置文件的路径.
--cri-socket string CRI socket 文件路径,如果为空 kubeadm 将自动发现相关的socket文件; 只有当机器中存在多个 CRI socket 或者 存在非标准 CRI socket 时才指定.
--dry-run 测试,并不真正执行;输出运行后的结果.
--feature-gates string 指定启用哪些额外的feature 使用 key=value 对的形式。
--help -h 帮助文档
--ignore-preflight-errors strings 忽略前置检查错误,被忽略的错误将被显示为警告. 例子: 'IsPrivilegedUser,Swap'. Value 'all' ignores errors from all checks.
--image-repository string 选择拉取 control plane images 的镜像repo (default "k8s.gcr.io")
--kubernetes-version string 选择K8S版本. (default "stable-1")
--node-name string 指定node的名称,默认使用 node 的 hostname.
--pod-network-cidr string 指定 pod 的网络, control plane 会自动将 网络发布到其他节点的node,让其上启动的容器使用此网络
--service-cidr string 指定service 的IP 范围. (default "10.96.0.0/12")
--service-dns-domain string 指定 service 的 dns 后缀, e.g. "myorg.internal". (default "cluster.local")
--skip-certificate-key-print 不打印 control-plane 用于加密证书的key.
--skip-phases strings 跳过指定的阶段(phase)
--skip-token-print 不打印 kubeadm init 生成的 default bootstrap token
--token string 指定 node 和control plane 之间,简历双向认证的token ,格式为 [a-z0-9]{6}\.[a-z0-9]{16} - e.g. abcdef.0123456789abcdef
--token-ttl duration token 自动删除的时间间隔。 (e.g. 1s, 2m, 3h). 如果设置为 '0', token 永不过期 (default 24h0m0s)
--upload-certs 上传 control-plane 证书到 kubeadm-certs Secret.6️⃣问题又来了
按步骤我一次的操作是能初始话成功,如果失败了可以kubeadm reset后再次初始化,
按照集群初始化完的几乎描述,完成几个基础配置(就快好了😆)
1
2
3
4
5
6
7
8
9
10mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
source /etc/profile
把join的那句也复制出来先,并在c2、c3上执行下
kubeadm join 192.168.0.31:6443 --token *****.************ \
--discovery-token-ca-cert-hash sha256:*************************查看👧pod们的状态
1
kubectl get pods --all-namespaces
然后发现两个坏👧不太愿意启动,codedns的两个
这个时候给他添加[flannel网络插件]
1
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
这里可以添加raw.githubusercontent.com在hosts中对应ip查询到的信息,或者
1
2wget https://sofunty.oss-cn-shenzhen.aliyuncs.com/k8s/kube-flannel.yml
kubectl apply -f kube-flannel.yml注意这里的pod网段,kubeadm中指定了pod的网段,所以我这里也对应改了一下
!!!🔥🔥🔥问题又来了,kube-flannel-*****的👧一直起不来,搜了搜,镜像拉不到😭
好吧,给docker搭把手💪,本地电脑pull下来后导出image再scp上去load input
1
2
3
4
5
6
7
8
9docker pull rancher/mirrored-flannelcni-flannel-cni-plugin:v1.0.0
docker pull quay.io/coreos/flannel:v0.15.1
docker save -o ./flannel-cni.tar rancher/mirrored-flannelcni-flannel-cni-plugin:v1.0.0
docker save -0 ./flannel.tar quay.io/coreos/flannel:v0.15.1
scp ./*.tar root@192.168.0.30:/root/
c1上再
docker load --input flannel-cni.tar && docker load --input flannel.tar
同样也scp到c2、c3导入解决的方式有点硬了,😬😬😬
后面reboot🖥️等待
1
kubectl get node

🤤🤤🤤🤤 🤤嘿 嘿嘿 嘿嘿
添加dashboard
1 | kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml |
创建token
👉docs
1 | echo 'apiVersion: v1 |
暂时到这啦
🌙🌙🌙
- 本文作者: 寒风
- 本文链接: https://blog.sofunty.cn/2021/12/09/k8s-build/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!