本文带大家了解K8S平台的搭建,本文采用三节点(一个master,两个node)安装方式。

操作系统初始化

首先做的是每台服务器的配置初始化,依次按如下步骤初始化。

① 关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

② 关闭 selinux

#临时生效
setenforce 0

#永久生效
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

③ 关闭 swap

#临时关闭
swapoff -a

#永久关闭,重启生效
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab

④ 配置内核参数

配置内核参数,将桥接的IPv4流量传递到iptables的链

yum install -y bridge-utils yum-utils

# 加载br_netfilter模块,使用lsmod查看开启的模块
modprobe  br_netfilter

cat <<EOF >  /etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

sysctl --system  # 重新加载所有配置文件

⑤ 设置系统用户名

# 分别在不同对应主机设置系统相关用户名
hostnamectl set-hostname k8s-master-1

⑥ 添加 hosts

vim /etc/hosts

192.168.17.130 k8s-master-1
192.168.17.131 k8s-node-1
192.168.17.133 k8s-node-2

⑦ 配置国内yum源

不建议使用CentOS 7自带的yum源,因为安装部分软件和依赖时会非常慢甚至超时失败。使用阿里云的源予以替换,执行如下命令:

mkdir /etc/yum.repos.d/bak && mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum makecache
yum -y update

安装 Docker

注:以下所有节点皆安装Docker / k8s组件

CentOS 安装参考官方文档:https://docs.docker.com/install/linux/docker-ce/centos/

① 卸载旧版本docker及组件

yum remove docker docker-common docker-selinux

② 安装依赖包

yum install -y yum-utils device-mapper-persistent-data lvm2

③ 安装 Docker 软件包源

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache

④ 安装 Docker CE

# 选择查看docker-ce各版本
yum list docker-ce --showduplicates | sort -r

# 安装指定版本的docker-ce
yum install docker-ce-20.10.6 -y

⑤ 启动 Docker 服务

systemctl start docker

⑥ 设置开机启动

systemctl enable docker

⑦ 验证安装是否成功

docker -v
docker info

docker_info.png

修改docker cgroup驱动,与k8s一致,使用systemd

# 修改docker cgroup驱动:native.cgroupdriver=systemd
cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF

systemctl restart docker  # 重启docker使配置生效

安装k8s组件

配置k8s yum源

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

安装kubelet kubeadm kubectl

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

可以看出当前安装的k8s的版本为1.21.0

k8s_version.png

开机启动kubelet

systemctl enable --now kubelet  # 开机启动kubelet

部署master节点

在master进行k8s集群初始化

根据前一步安装信息,安装相应版本的k8s(此处为1.21.0)

kubeadm init --kubernetes-version=1.21.0 \
--apiserver-advertise-address=192.168.17.130 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16

此处需要科学上网才能将需要镜像下载下来,网络教程上的相关阿里源经测试发现不可用,且未找到相关的第三方源,此处可用docker上的替代镜像下载下来重打tag后也可使用,重打tag后执行上述命令后检测到镜像都有话就不会再去额外pull镜像。(此处需要一部分docker相关使用知识。可自行搜索下如何docker重打tag)

定义POD的网段为:10.244.0.0/16,api server地址就是master本机IP地址。
k8s_successfully.png

记录生成的最后部分内容(如下),此内容需要在其它node节点加入k8s集群时执行(暂不执行)。

kubeadm join 192.168.17.130:6443 --token ldg7y7.btxdr0y9ed0jonyz \
    --discovery-token-ca-cert-hash sha256:faf9ffddaf79ec950391abe4fa5fb6baf63374a530e76fd2615a537bfb624b23

初始化过程说明:

  • [preflight] kubeadm 执行初始化前的检查。
  • [kubelet-start] 生成kubelet的配置文件”/var/lib/kubelet/config.yaml”
  • [certificates] 生成相关的各种token和证书
  • [kubeconfig] 生成 KubeConfig 文件,kubelet 需要这个文件与 Master 通信
  • [control-plane] 安装 Master 组件,会从指定的 Registry 下载组件的 Docker 镜像。
  • [bootstraptoken] 生成token记录下来,后边使用kubeadm join往集群中添加节点时会用到
  • [addons] 安装附加组件 kube-proxy 和 kube-dns。 Kubernetes Master 初始化成功,提示如何配置常规用户使用kubectl访问集群。 提示如何安装 Pod 网络。 提示如何注册其他节点到 Cluster。

配置kubectl工具

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

在master节点部署flannel网络

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

kubectl apply -f kube-flannel.yml

将master节点作为工作节点(可选)

k8s集群默认不会将Pod调度到master上,这样master的资源就浪费了。在master上,可以运行以下命令使其作为一个工作节点(下方的k8s-master-1为你的k8s的master节点名称,若不一致请替换,下同):

kubectl taint node k8s-master-1 node-role.kubernetes.io/master-

若后期将Master节点恢复成Master Only状态,则执行如下命令恢复:

kubectl taint node k8s-master-1 node-role.kubernetes.io/master="":NoSchedule

此时在node节点执行以下命令:

kubeadm join 192.168.17.130:6443 --token ldg7y7.btxdr0y9ed0jonyz \
    --discovery-token-ca-cert-hash sha256:faf9ffddaf79ec950391abe4fa5fb6baf63374a530e76fd2615a537bfb624b23

验证集群是否正常

当所有节点加入集群后,稍等片刻,在master节点上运行kubectl get nodes可以看到:

get_nodes.png

如上,若提示notReady则表示节点尚未准备好,可能正在执行其他初始化操作,等待全部变为Ready即可。

另外,建议查看所有pod状态,运行kubectl get pods -n kube-system

get_pods.png

如上,全部Running则表示集群正常。至此,k8s集群就搭建完成了。

安装dashboard

注:此操作只需在Master上操作

下载安装dashboard用yaml文件

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml

修改kubernetes-dashboard的service类型为NodePort类型

修改kubernetes-dashboard的service类型为NodePort类型,使用nodeport方式访问Dashboard 。

[root@k8s-master-1 dashboard]# vim recommended.yaml
...
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  type: NodePort # 新增
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30443 # 新增
  selector:
    k8s-app: kubernetes-dashboard

安装Dashboard

kubectl create -f recommended.yaml

确认Dashboard 关联pod和service的状态

kubectl get pod,svc -n kubernetes-dashboard

确认关联状态.png

创建serviceaccount和clusterrolebinding资源YAML文件

[root@k8s-master-1 ~]# vim adminuser.yaml

---
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

创建admin-user并且赋予admin-user集权管理员权限

kubectl create -f adminuser.yaml

浏览器访问Dashboard UI

浏览器访问https://IP:30443

访问Dashboard_UI.png

查看token

获取token,用于登录Dashboard UI

[root@k8s-master-1 ~]# kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
Name:         admin-user-token-4xsrc
Namespace:    kubernetes-dashboard
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: admin-user
              kubernetes.io/service-account.uid: 31eefad2-a203-49ac-99ec-e7372aefb096

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1066 bytes
namespace:  20 bytes
token:          eyJhbGciOiJSUzI1NiIsImtpZCI6IjRVUUp2SlkxeGVValphWUZQbWRWZlZDR2RiYWRyZ0JLNjlwZ0Z1TVBEMWcifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLWprdnRkIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIxYWYyZGE4Zi04ZTI5LTQ5MzktYjM4ZC1mNzc0Mjg0OGJlMWQiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.Y9V2j56RXucVkoZfdQmHquRDK2XGAMT1E4VvooEXuh0TtJRLMhXxBPuPOLv0CMQbShSwglZnjH_NTdCm9NNhVgBERS0c-71_mnLhlMtmtfdCTsYLApOJGkDij8NZFwZSmg1JMjg009ycykhMBMLbVffBb-eCS7AY-InJowdVxgXsT3c6ra0CteNQMVtGv75FAE0OjWLb-qmuI7otuojvoQxegZ0zmIYhtz486f7stqPkZNWZijGHjvmo5NQCEroVxId4rOib2PFRD_wjqA_-43oIScQR77vdUcN5X8Yu_FH9D5hKV-jSnamHu8E79iltUTR9iEHOLZ69jIWMAm2jAw

登录Dashboard UI

输入第二部获取到的token值,点击登录按钮

Login_Dashboard.png

K8S卸载

若需卸载K8S集群,下方提供相关卸载操作(所有节点皆需执行):

重置K8S:
kubeadm reset

清理:
kubeadm reset -f
modprobe -r ipip
lsmod   #列出模块
rm -rf ~/.kube/
rm -rf /etc/kubernetes/
rm -rf /etc/systemd/system/kubelet.service.d
rm -rf /etc/systemd/system/kubelet.service
rm -rf /usr/bin/kube*
rm -rf /etc/cni
rm -rf /opt/cni
rm -rf /var/lib/etcd
rm -rf /var/etcd
文章名: 《K8S平台搭建(非二进制安装)》

文章链接:https://www.yfriend.xyz/1186.html

除特别注明外,文章均为深度博客所创,转载时请注明本文出处及文章链接
Last modification:June 5th, 2021 at 03:20 pm
如果觉得我的文章对你有用,请随意赞赏