本文参考:https://zhuanlan.zhihu.com/p/558014199?utm_id=0
1. 安装Docker
1.1 安装docker 20.10.7
注意 Docker 版本,要和 Kubernetes 版本 有对应关系
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 # 安装/更新 yum-utils yum install -y yum-utils # 配置 yum源 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 安装 docker 20.10.7 版本 yum -y install docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io # 查看 docker 版本 docker -v # 启动 docker systemctl start docker # 设置开机自启 systemctl enable docker # 查看 docker 是否成功, 有 Client 和 Server 即成功 docker version
1.2 配置加速镜像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"], "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2" } EOF # 重启docker的后台线程 sudo systemctl daemon-reload # 重启docker服务 sudo systemctl restart docker # 查看是否配置成功 docker info
2. 安装Kubernetes
每台机器2GB或者更多的RAM(如果少于这个数字 将会影响应用的运行内存)
CPU2核以上
集群中所有的服务器的网络彼此可以相互连接。
关闭防火墙
1 2 systemctl stop firewalld NetworkManager systemctl disable firewalld NetworkManager
2.1 设置hostname
1 2 3 4 5 6 7 8 9 10 # 查看主机名 hostname # 设置主机名 hostnamectl set-hostname k8s-master hostnamectl set-hostname k8s-node1 hostnamectl set-hostname k8s-node2 # 更新 bash
2.2 关闭交换区
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # 查看 交换分区 free -m # 将 SELinux 设置为 permissive 模式(相当于将其禁用) 第一行是临时禁用,第二行是永久禁用 setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config # 关闭swap;第一行是临时禁用,第二行是永久禁用 swapoff -a sed -ri 's/.*swap.*/#&/' /etc/fstab # 允许 iptables 检查桥接流量 (K8s 官方要求) cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf br_netfilter EOF cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF # 让配置生效 sysctl --system
2.3 安装K8S三大件
安装 kubelet、kebeadm、kubectl;注意版本 (1.20.9)
1 2 3 4 5 6 7 8 9 10 11 # 配置 k8s 的 yum 源地址 cat <<EOF | sudo tee /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
1 2 3 4 5 6 7 8 9 # 安装 kubelet、kubeadm、kubectl yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes # 启动kubelet systemctl enable --now kubelet # 查看 kubelet 状态:一会停止 一会运行。 这个状态是对的,kubelet 等待 kubeadm 发号指令。 systemctl status kubelet
2.4 使用kubeadm引导集群
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # 配置镜像,生成 images.sh sudo tee ./images.sh <<-'EOF' # !/bin/bash images=( kube-apiserver:v1.20.9 kube-proxy:v1.20.9 kube-controller-manager:v1.20.9 kube-scheduler:v1.20.9 coredns:1.7.0 etcd:3.4.13-0 pause:3.2 ) for imageName in ${images[@]} ; do docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName done EOF # 拉取镜像 chmod +x ./images.sh && ./images.sh
2.5 初始化主节点,即把看 k8s-master 变为主节点
1 2 3 # 所有机器添加 master 域名映射,以下 IP 为 master 的 IP; # 访问 k8s-master 即 访问 192.168.1.135 echo "192.168.1.135 k8s-master" >> /etc/hosts
1 2 3 4 5 6 7 8 9 10 11 # 主节点初始化 (只在 master 服务器执行, 其他 node 不用) # --apiserver-advertise-address: master 的 IP # --control-plane-endpoint: master 的域名 # --service-cidr 和 --pod-network-cidr 是网络范围,雷神 建议不要改。要改的话 2 个cidr 和 vps(192.168.x.x) 的,3 个网络互相不能重叠;还要修改 calico.yaml的 IP(下图有写)。 kubeadm init \ --apiserver-advertise-address=192.168.1.135 \ --control-plane-endpoint=k8s-master \ --image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \ --kubernetes-version v1.20.9 \ --service-cidr=10.96.0.0/16 \ --pod-network-cidr=192.168.0.0/16
2.5 根据提示继续
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 Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $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/admin.conf You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ You can now join any number of control-plane nodes by copying certificate authorities and service account keys on each node and then running the following as root: kubeadm join k8s-master:6443 --token is7ewi.nznlk1wdhsaocmp1 \ --discovery-token-ca-cert-hash sha256:b2795fca75bab316c566e98a619a3ce9b18c418e978c7b8fa9c48ff4143fd3c5 \ --control-plane Then you can join any number of worker nodes by running the following on each as root: kubeadm join k8s-master:6443 --token is7ewi.nznlk1wdhsaocmp1 \ --discovery-token-ca-cert-hash sha256:b2795fca75bab316c566e98a619a3ce9b18c418e978c7b8fa9c48ff4143fd3c5
To start using your cluster, you need to run the following as a regular user:
要开始使用集群,您需要以普通用户身份运行以下命令(master节点执行 ):源自上面的提示
1 2 3 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
2.6 安装网络组件(calico)
注:只在 master 服务执行。其他 node 服务器 不用。
1 2 3 4 5 # 下载 calico.yaml curl https://docs.projectcalico.org/manifests/calico.yaml -O # 加载配置 kubectl apply -f calico.yaml
1 kubectl apply -f https://docs.projectcalico.org/v3.18/manifests/calico.yaml
1 kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
注意
1 2 3 如果修改了 初始化主节点中的 --pod-network-cidr=192.168.0.0/16 将 calico.yaml 的配置, # 去掉,IP 写 改的 IP。
2.7 Worker 加入集群
1 2 kubeadm join k8s-master:6443 --token is7ewi.nznlk1wdhsaocmp1 \ --discovery-token-ca-cert-hash sha256:b2795fca75bab316c566e98a619a3ce9b18c418e978c7b8fa9c48ff4143fd3c5
2.8 每次重启需要先启动docker,否则k8s无法启动
2.9 令牌过期
1 2 # 重新获取令牌 kubeadm token create --print-join-command
2.10 部署Dashboard
2.10.1 运行pod(创建资源)
部署 dashboard(可视化页面), kubernetes 官方提供的可视化界面
1 2 # 根据 在线配置文件 创建资源 kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
1 2 # 本地配置 kubectl apply -f recommended.yaml
2.10.2 设置访问端口
1 2 3 4 5 # 修改配置文件 找到 type ,将 ClusterIP 改成 NodePort kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard # 找到端口,在安全组放行 kubectl get svc -A |grep kubernetes-dashboard
32499即为访问端口,以后只需要使用任一节点的ip+32499即可访问
https://192.168.1.135:32499 (要注意是 https,port 是映射的端口,在配置文件查看)
3 疑难杂症
3.1 删除现有的dashboard服务
1 kubectl delete service kubernetes-dashboard --namespace=kubernetes-dashboard
1 kubectl delete -f recommended.yaml
若资源下载不下来,则直接本地导入recommended.yaml ,下载地址如下
https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
1 kubectl apply -f recommended.yaml
3.2 dashboard启动失败(无法访问)
修改了 NodePort 后,Pod kubernetes-dashboard 起不来了。(环境:虚拟机)
1 2 # 查看日志 kubectl logs -f -n kubernetes-dashboard kubernetes-dashboard-658485d5c7-f89v7
解决思路
1 2 1、将 dashboard 部署到 master上,因为 master 刚安装了网络组件 2、让 工作节点 也能访问 apiServer
方案1
1 2 # 无法访问,查看 部署到 哪个 node 上了, 将 dashboard 部署到 master 上 kubectl get pods -A -o wide
1 # 修改 recommended.yaml,添加下面
1 2 3 4 5 6 7 # 重新安装 dashboard # 修改配置文件 找到 type ,将 ClusterIP 改成 NodePort kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard # 找到端口,在安全组放行 kubectl get svc -A |grep kubernetes-dashboard
1 2 # 创建访问账号,准备一个yaml文件 vim dash-usr.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kubernetes-dashboard --- 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
1 kubectl apply -f dash-usr.yaml
1 2 # 获取访问令牌 kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"
1 eyJhbGciOiJSUzI1NiIsImtpZCI6IkZkbV91WkVqTnp3clZLd29JS1FYUWxURzZyd0FLcnpVQzBtRlRMTmpya0UifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLTVrbGtrIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJiNWVhYjQ2MS0xNjE1LTQ5ZTQtYTAzNC0wY2MxYWM1YTI5ODkiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.eum4COcUzn6wt_ vOpCUUEiNENzeGUTC_ ZlKeB8d0IplFlZWrAav3RbqV5LMDRRIyyZ-7csJb3COhFEiCRtlkc9MM60od4IRMscNxv_ tm11A32pmGn9eFERyaYjKUFBHZfF34jPcsjYqU50TDn6wykI_ B6r9ZzvpJemR-wqF2y-GBvmz8q19D9q5zlhaE9gmmvksEx-D0ZyOeZo4tMdbD757OdTjgzlYhmTpfTs-Z8-sdKWnHGFCYbAPzrEgMgChcIjlyDle9-JaE1WCosGCA73xsBzXNnkvYC7YB_ tagX4BhGDZEu4eyRNbgCAqO6of6QnvDXvlesd59IU-WMVE-7Q