K8s集群搭建(整体流程记录)
经过一个星期的尝试,k8s 终于搭建完成。目前网上关于k8s搭建的相关文档,大部分都一个样,互相copy。 其中坑也很多,但都没有在博客中提到。今天终于从坑中爬出来了,特此记录。个人理解:k8s 搭建 流程 : CentOs => utils依赖 => docker =>kubeadm, kubelet ,kubectl => master init => 调配网络
经过一个星期的尝试,k8s 终于搭建完成。
目前网上关于k8s搭建的相关文档,大部分都一个样,互相copy。 其中坑也很多,但都没有在博客中提到。今天终于从坑中爬出来了,特此记录。
个人理解:
k8s 搭建 流程 : CentOs => utils依赖 => docker =>kubeadm, kubelet , kubectl => master init => 调配网络 => node join => ok
Web UI : 获取yaml => 修改 yaml => apply yaml => vi user_yaml => 获取 token => ok
其中 ,我卡住的点依次如下:
1.utils 依赖 安装完 不清楚哪些有用,哪些没用,版本差异等;
2.docker 因为没看命令,把之前的image 清了,还好是私人测试环境 且有备份;
3.kubeadm, kubelet , kubectl 安装完不会用
4.master init [ERROR FileAvailable--etc-kubernetes-kubelet.conf]: /etc/kubernetes/kubelet.conf already exists [ERROR Port-10250]: Port 10250 is in use (已在另一篇文章解释)
5.调配网络 ,(已在另一篇文章解释)
6. kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.1.0/aio/deploy/recommended.yaml
raw.githubusercontent.com 无法连接;
7. 不清楚yaml 是干什么的 ;
8.不清楚我按步骤安装,到底能不能用,问题卡在哪里 等等;
9.dashboard 懵逼阶段。
总结:
按照那些博客分享的流程安装,大致都没问题。关键点在于:
1. init 时 , kubelet.conf already exists 或接口占用的,要先 kubeadm reset 重置, 把该删的删了
2.调配网络时,无论flannel 还是 calico : [kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
因为网络问题可以多试几次(其实我第一次安装 timeout 后就放弃了calico ,拖了两天,重试一次竟然通了,玄学)
3.理解yaml 。我就是没怎么看理论知识,不知道yaml 干什么的,所以才一直卡在
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.1.0/aio/deploy/recommended.yaml 这一块
yaml : k8s 的 yaml 角色 ,相当于 Docker 的 dockerfile。 k8s 通过 apply 指定的 yaml ,create pod 。(docker 通过 Dockerfile 创建 image)。
GitHub 推荐 kubectl apply -f https://raw.githubusercontent.com xxx。会因为外网网络问题 无法访问该网址及文件。
百度说: 去解析这个ip地址 然后添加到 /etc/hosts 上 reboot ,但并没有什么用。或
推荐安装各种网络插件,企图去访问Github上 这个日本ip,但并没有什么用 。
卡了两天,问题得到解决,简单粗暴:
https://github.com/kubernetes/dashboard 下载源码。 上传至master 服务器。解压。想要的文件 就在
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.1.0/aio/deploy/recommended.yaml 中的 dashboard/v2.1.0/aio/deploy/recommended.yaml 路径下
不同版本路径可能不同,yaml 名字可能也不同 。 但根据官网提供的apply 路径,去找,就能找到。yaml 原理弄明白。 dashboard 就能安装上。
k8s 集群部署介绍:
3台Centos7,1个 master 2个 node
k8s : v2.1.0
三台机器执行:
环境:hostname , ssh 免密,防火墙,linux 内核关闭 ,关闭 swap 等,
systemctl stop firewalld && systemctl disable firewalld
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
swapoff -a
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
iptables -F && iptables -X && iptables \
-F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
1. utils 依赖
yum -y update
yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp
2.docker 安装
提示:若已安装乱了的,干脆直接docker 清掉 重新安装
sudo yum remove docker docker latest docker-latest-logrotate \
docker-logrotate docker-engine docker-client docker-client-latest docker-common
若有成熟的项目正在运行,注意不要把docker 干掉 或 rmi。
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager \
--add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum list | grep docker-ce
sudo yum makecache fast
sudo yum install -y docker-ce-18.09.0 docker-ce-cli-18.09.0 containerd.io
sudo systemctl start docker && sudo systemctl enable docker
3.kubeadm, kubelet and kubectl
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 install -y kubeadm kubelet kubectl
vi /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
systemctl restart docker
sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g"
/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
systemctl enable kubelet && systemctl start kubelet
找不到文件就自己创建一个,已存在就把之前的清了
拉取镜像:
kubeadm config images list
# ====================================================================================
k8s.gcr.io/kube-apiserver:v1.20.0
k8s.gcr.io/kube-controller-manager:v1.20.0
k8s.gcr.io/kube-scheduler:v1.20.0
k8s.gcr.io/kube-proxy:v1.20.0
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.13-0
k8s.gcr.io/coredns:1.7.0
# ====================================================================================
# 创建kubeadm.sh脚本,用于拉取镜像
vi kubeadm.sh
# ====================================================================================
#!/bin/bash
set -e
KUBE_VERSION=v1.20.0
KUBE_PAUSE_VERSION=3.2
ETCD_VERSION=3.4.13-0
CORE_DNS_VERSION=1.7.0
GCR_URL=k8s.gcr.io
ALIYUN_URL=registry.cn-hangzhou.aliyuncs.com/google_containers
images=(kube-proxy:${KUBE_VERSION}
kube-scheduler:${KUBE_VERSION}
kube-controller-manager:${KUBE_VERSION}
kube-apiserver:${KUBE_VERSION}
pause:${KUBE_PAUSE_VERSION}
etcd:${ETCD_VERSION}
coredns:${CORE_DNS_VERSION})
for imageName in ${images[@]} ; do
docker pull $ALIYUN_URL/$imageName
docker tag $ALIYUN_URL/$imageName $GCR_URL/$imageName
docker rmi $ALIYUN_URL/$imageName
done
# ====================================================================================
sh 脚本。 docker images ,查看 => Ok,公共资源搭建完毕。
搭建 Master,只在master 节点上执行:
kubeadm reset
kubeadm init --kubernetes-version=1.20.0 \
--apiserver-advertise-address= x.x.x.x 【即master ip】 \
--pod-network-cidr=10.244.0.0/16
会得到 :
kubeadm join x.x.x.x:6443 --token xxxx -discovery-token-ca-cert-hash sha256:1df02a
这段话留着,一会有用。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
即 /root/.kube/config
-
kubectl get pods -n kube-system 【查看kube-system的pods】
-
kubectl get pods --all-namespaces 【查看所有pods】
前两项为 Pending ,问题不大,继续。
master 部署 calico :
kubectl apply -f https://docs.projectcalico.org/v3.9/manifests/calico.yaml
kubectl get pods --all-namespaces -w
# 这个可能会因为网络问题,卡顿, timeout 等,可以适当多重试几次,或按照 前面总结说的,直接去下载这个 yaml 上传到服务器, 自己 apply
搭建 node, 执行 join
复制前面 init 的 join 信息 ,在 node 2 ,node 3 上执行。
可能也会卡 Bootstrip , 多试几次
kubectl get nodes 查看是否 Join 成功。
k8s 搭建完成
dashboard 搭建:
1. yaml .
可以 wget, 或者直接 apply ,只要你能连得上 那个github ip 。
反正我连不通,我选择了直接下载,然后上传,(前面总结提到的)
vi recommended.yaml 看好 kind 名字 找到对应位置。
kubectl create -f recommended.yaml
kubectl proxy --address='0.0.0.0' --accept-hosts='^*$'
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
EOF
cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
EOF
curl localhose:30443
返回: Client sent xxxx server
浏览器访问,https://master:30443,
不能正常访问dashboard页面的,前面注意 https 可能是证书问题
可以访问网页后:
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | sls admin-user | ForEach-Object { $_ -Split '\s+' } | Select -First 1)
Data
====
ca.crt: 1066 bytes
namespace: 20 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXY1N253Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIwMzAzMjQzYy00MDQwLTRhNTgtOGE0Ny04NDllZTliYTc5YzEiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.Z2JrQlitASVwWbc-s6deLRFVk5DWD3P_vjUFXsqVSY10pbjFLG4njoZwh8p3tLxnX_VBsr7_6bwxhWSYChp9hwxznemD5x5HLtjb16kI9Z7yFWLtohzkTwuFbqmQaMoget_nYcQBUC5fDmBHRfFvNKePh_vSSb2h_aYXa8GV5AcfPQpY7r461itme1EXHQJqv-SN-zUnguDguCTjD80pFZ_CmnSE1z9QdMHPB8hoB4V68gtswR1VLa6mSYdgPwCHauuOobojALSaMc3RH7MmFUumAgguhqAkX3Omqd3rJbYOMRuMjhANqd08piDC3aIabINX6gP5-Tuuw2svnV6NYQ
token 填 浏览器 上 ,Ok
部署完成。
更多推荐
所有评论(0)