{"msg":"操作成功","code":200,"data":{"createBy":"admin","createTime":"2021-07-10 17:36:36","updateBy":"admin","updateTime":"2021-07-10 17:36:36","remark":null,"id":64,"articleTitle":"Kubernetes（二）集群安装","articleUrl":"k8s_cluster","articleThumbnail":"https://www.asumimoe.com/imgfiles/20220906/f93daad129a04b8db74eed70cd45263b.png","articleFlag":"0","draftStatus":"1","reprintStatement":"1","articleSummary":"Kubernetes集群的方式为M个master节点和N个node节点。确保高可用的情况下(M>=3,N>=2)，本次实验使用简化的集群方式为1个Master节点和2个Node节点。","articleContent":"## 集群中节点初始化设置\n\nKubernetes集群的方式为M个master节点和N个node节点。确保高可用的情况下(M>=3,N>=2)，本次实验使用简化的集群方式为1个Master节点和2个Node节点。\n\n### 1.启动三台虚拟机并配置好IP及主机名\n\n本次实验中的Master节点和Node节点的主机名及IP分配如下：\n\n```css\nMaster  k8s-master  192.168.100.101\nNode1   k8s-node1   192.168.100.102\nNode2   k8s-node2   192.168.100.103\n```\n\n将主机名解析写入到三台服务器的/etc/hosts文件中：\n\n```shell\nhostnamectl set-hostname xxx # 每台机器配置自己的主机名\n\ncat >> /etc/hosts <<EOF\nk8s-master  192.168.100.101\nk8s-node1   192.168.100.102\nk8s-node2   192.168.100.103\nEOF\n```\n\n### 2.关闭交换分区及防火墙\n\n```shell\n# 关闭交换分区\nsed -i '/swap/{s/^/#/}' /etc/fstab\nswapoff -a && sysctl -w vm.swappiness=0\n\n# 关闭防火墙\nsetenforce 0\nsed -i “s/\\(SELINUX=\\)disabled/\\1enforcing/g” /etc/sysconfig/selinux\nsystemctl stop firewalld && systemctl disable firewalld\n```\n\n### 3.允许iptables检查桥接流量\n\n```shell\ncat > /etc/modules-load.d/k8s.conf <<EOF\nbr_netfilter\nEOF\n\ncat > /etc/sysctl.d/k8s.conf << EOF\nnet.bridge.bridge-nf-call-ip6tables = 1\nnet.bridge.bridge-nf-call-iptables = 1\nEOF\nsysctl --system\n```\n\n## 安装Kubernetes集群\n\n### 1.安装docker服务\n\n```bash\nyum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io-20.10.7\n\ncat > /etc/docker/daemon.json <<EOF \n{ \n  \"exec-opts\": [\"native.cgroupdriver=systemd\"], \n  \"log-driver\": \"json-file\", \n  \"log-opts\": { \"max-size\": \"100m\" },\n  \"registry-mirrors\": [\"https://s1k32y4r.mirror.aliyuncs.com\"]\n}\nEOF\nsystemctl restart docker && systemctl enable docker\n```\n\n### 2.安装kubectl、kubeadm、kubelet\n\n```shell\n# 配置安装源\ncat >/etc/yum.repo.d/k8s.repo <<EOF\n[k8s]\nname=k8s\nenabled=1\ngpgcheck=0\nbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/\nEOF\n\nyum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes\n\nsystemctl enable --now kubelet # kubelet启动后每个几秒就会重启，是因为它陷入了一个等待kubeadm指令的死循环。\n# 由于内核版本过低，kubelet版本过高也可能导致kubelet无法启动，执行yum update升级版本\n```\n\n### 3.初始化主节点\n\n```bash\n#Master节运行如下命令\nkubeadm init \\\n--image-repository registry.aliyuncs.com/google_containers \\\n--kubernetes-version v1.20.9 \\\n--control-plane-endpoint=k8s-master \\\n--apiserver-advertise-address 192.168.100.101 \\\n--service-cidr=10.96.0.0/16 \\\n--pod-network-cidr=10.144.0.0/16\n\n# 根据提示执行如下命令\nmkdir -p $HOME/.kube\nsudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config\nsudo chown $(id -u):$(id -g) $HOME/.kube/config\n\n# 部署集群网络\nkubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml\n```\n\n查看集群状态\n\n```shell\nkubectl get nodes\nNAME         STATUS   ROLES                  AGE    VERSION\nk8s-master   Ready    control-plane,master   1d     v1.20.9\n```\n\n### 4.新节点加入集群\n\nMaster节点初始化时会自动产生一个token，可以根据这个token以及执行k8s为我们自动生成的命令来使新节点加入我们的k8s集群。\n\n```shell\nkubeadm join 192.168.100.101:6443 --token 7sfa7q.dbsl3f20v9bve3fp \\\n\t--discovery-token-ca-cert-hash sha256:10ce50e2b46eee764231466f1ad8e615795fd8125ab3ad96ab488519fac67197\n\n# 默认的token有效期为24小时，token过期后就要重新获取token\nkubeadm token create --print-join-command\n```\n\n查看新加入集群的节点\n\n```shell\nkubectl get no\nNAME         STATUS   ROLES                  AGE    VERSION\nk8s-master   Ready    control-plane,master   1d     v1.20.9\nk8s-node1    Ready    <none>                 1d     v1.20.9\nk8s-node2    Ready    <none>                 1d     v1.20.9\n```\n\n### 5.dashboard\n\nk8s官方为我们提供了一个可视化界面。\n\n```shell\nkubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml\n```\n\n设置访问端口\n\n```shell\nkubectl edit svc kubernetes-dashboard -n kubernetes-dashboard\ntype: ClusterIP 修改为type: NodePort\n\nkubectl get svc -A | grep kubernetes-dashboard # 找到端口\n```\n\n访问dashboard页面https://nodeIP:PORT，此端口为大于30000的随机端口，IP为Node节点的IP。\n\ndashboard初次访问需要创建一个访问账号：\n\n```yaml\n准备一个dash-user.yml文件\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: admin-user\n  namespace: kubernetes-dashboard\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  name: admin-user\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: cluster-admin\nsubjects:\n- kind: ServiceAccount\n  name: admin-user\n  namespace: kubernetes-dashboard\n```\n\n```shell\nkubectl apply -f dash-user.yml\n```\n\n获取访问令牌\n\n```shell\nkubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath=\"{.secrets[0].name}\") -o go-template=\"{{data.token | base64decode}}\"\n```\n\n## Node管理\n\n### Node的隔离与恢复\n\n在硬件升级、维护等情况下，需要将某些Node隔离，使其脱离Kubernetes集群的调度范围。Kubernetes提供了一种机制，既可以将Node纳入调度范围，也可以将Node脱离调度范围。\n\n```shell\nkubectl patch node node1 -p '{\"spec\":{\"unschedulable\":true}}'\nkubectl cordon node1\n# 两个命令的效果相同，只需要执行任意一个即可\n```\n\n需要注意的是，将某个Node脱离调度范围，只是之后新创建的Pod不会向该Pod调度。已经在运行的Pod并不会自动停止，需要管理员手动停止该Node上运行的Pod。\n\n如果需要将某个Pod重新纳入集群调度范围，使用如下命令：\n\n```shell\nkubectl patch node node1 -p '{\"spec\":{\"unschedulable\":false}}'\nkubectl uncordon node1\n```\n\n### Node加入与删除\n\n在Kubernetes集群中，如果服务器资源不足就需要购买新的服务器加入集群中。完成对集群的扩容。\n\nNode的加入是十分简单的，只需要在新的Node上安装docker、kubelet和kubeadm。利用重新生成的token就可加入集群。\n\n```shell\nkubeadm join 192.168.100.101:6443 --token 7sfa7q.dbsl3f20v9bve3fp \\\n\t--discovery-token-ca-cert-hash sha256:10ce50e2b46eee764231466f1ad8e615795fd8125ab3ad96ab488519fac67197\n# Node重新加入集群首先要执行kubectl reset命令\n# 默认的token有效期为24小时，token过期后就要重新获取token\nkubeadm token create --print-join-command\n```\n\n同样，集群有新Node加入，就有就的Node移除，如该Node已经不可用，需要将该Node从集群中删除。\n\n```shell\n# 将node1节点设置为维护模式\nkubectl drain node1 --delete-emptydir-data=true --force --ignore-daemonsets\nkubectl delete no node1\n```\n\n### Label更新\n\n对于正在运行的资源对象，我们随时可以通过kubectl label命令进行增加、修改、删除label的操作。\n\n```shell\n# 添加label\nkubectl label no node1 disk=ssd\n# 删除一个label只需在label的key名后加一个减号即可\nkubectl label no node1 disk-\n# 更新label需要加--overwrite参数\nkubectl label no node1 disk=hard --overwrite\n```","categoryId":10,"viewCount":539,"categoryName":"Kubernetes","author":"球接子","authorAvatar":null,"tagIds":[16],"tagNames":["Kubernetes"]}}