8.kubeadmin安装k8s集群

2022-04-11 分类:k8s 阅读(384) 评论(0)

孙富阳, 江湖人称没人称。多年互联网运维工作经验,曾负责过孙布斯大规模集群架构自动化运维管理工作。擅长Web集群架构与自动化运维,曾负责国内某大型博客网站运维工作。

1.环境准备

1.虚拟机准备

机器名ip地址cpu和内存要求
kubernetes-master10.0.0.112c4g(关闭swap)
kubernetes-node110.0.0.122c4g(关闭swap)
(1)一台兼容的Linux主机。Kubernetes项目为基于Debian和Red Hat的Linux发行版以及一些不提供包管理器的发行版提供通用的指令;
(2)每台机器2GB或更多的RAM(如果少于这个数字将会影响你应用的运行内存),2个CPU核或更多;
(3)集群中的所有机器的网络彼此均能相互连接(公网和内网都可以);
推荐阅读:
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#before-you-begin
温馨提示:强烈建议将集群的所有主机名在host文件中进行解析

2.关闭交换分区并允许iptables检查桥接流量

所有节点执行
(1)临时禁用swap分区:swapoff -a
永久禁用swap分区:修改"/etc/fstab"配置文件即可。
(2)确保"br_netfilter"模块被加载。这一操作可以通过运行"lsmod | grep br_netfilter"来完成。
(3)若要显式加载该模块,可执行"modprobe br_netfilter"
详细操作如下:
lsmod | grep br_netfilter
modprobe br_netfilter
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
sudo sysctl --system

3.安装容器运行时

为了在Pod中运行容器,Kubernetes使用容器运行时(Container Runtime)。
默认情况下,Kubernetes使用容器运行时接口(Container Runtime Interface,CRI)来与你所选择的容器运行时交互。如果你不指定运行时,则kubeadm会自动尝试检测到系统上已经安装的运行时, 方法是扫描一组众所周知的Unix 域套接字。
下面的表格列举了一些容器运行时及其对应的套接字路径:
Docker:
    /var/run/dockershim.sock
containerd:
    /run/containerd/containerd.sock
CRI-O:
    /var/run/crio/crio.sock
如果同时检测到Docker和containerd,则优先选择Docker,因为Docker 18.09附带了containerd并且两者都是可以检测到的。如果检测到其他两个或多个运行时,kubeadm输出错误信息并退出。
kubelet通过内置的dockershim CRI实现与Docker集成。
#所有节点
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
yum list docker-ce --showduplicates
#安装指定版本的docker,如下图所示,对于K8S 1.15版本最高支持的docker版本为18.09哟~
yum -y install docker-ce-18.09.9 docker-ce-cli-18.09.9
yum -y install bash-completion
source /usr/share/bash-completion/bash_completion
# 配置Docker守护程序,尤其是使用systemd来管理容器的cgroup,否则会导致kubelet无法正常启动哟~
mkdir /etc/docker
cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "insecure-registries": ["k8s221.oldboyedu.com:5000"],
  "registry-mirrors": ["https://tuv7rqqq.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF
# 重新启动Docker并在启动时启用
systemctl enable docker
systemctl daemon-reload
systemctl restart docker
推荐阅读:
https://kubernetes.io/zh/docs/setup/production-environment/container-runtimes/
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.15.md#unchanged
温馨提示:
如下图所示,如果你安装的是K8S1.15版本,则最高支持"18.09"的docker版本

4.禁用selinux服务

setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
温馨提示:
 (1)SELinux设置为permissive模式相当于将其禁用;
 (2)禁用selinux这是允许容器访问主机文件系统所必需的,而这些操作时为了Pod网络工作正常。你必须这么做,直到kubelet做出对SELinux的支持进行升级为止;
 (3)如果你知道如何配置 SELinux则可以将其保持启用状态,但可能需要设定kubeadm不支持的部分配置;

5.推荐阅读

https://kubernetes.io/zh/docs/setup/production-environment/container-runtimes/
https://kubernetes.io/zh/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/
https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm/
https://kubernetes.io/zh/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/

2.安装 kubeadm、kubelet 和 kubectl

1.待安装软件包作用说明

你需要在每台机器上安装以下的软件包:
kubeadm:用来初始化集群的指令。
kubelet:在集群中的每个节点上用来启动Pod和容器等。
kubectl:用来与集群通信的命令行工具。
kubeadm不能帮你安装或者管理kubelet或kubectl,所以你需要确保它们与通过kubeadm安装的控制平面(master)的版本相匹配。 如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。
然而,控制平面与kubelet间的相差一个次要版本不一致是支持的,但kubelet的版本不可以超过"API SERVER"的版本。 例如,1.7.0版本的kubelet可以完全兼容1.8.0版本的"API SERVER",反之则不可以。
推荐阅读:
https://kubernetes.io/zh/docs/tasks/tools/

2.所有节点安装kubeadm软件包

(1)配置软件源
cat  > /etc/yum.repos.d/kubernetes.repo <<EOF
[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
(2)安装指定的kubeadm版本
yum -y install kubelet-1.15.12-0 kubeadm-1.15.12-0 kubectl-1.15.12-0 
systemctl enable kubelet && systemctl start kubelet
ps: 由于官网未开放同步方式, 可能会有索引gpg检查失败的情况, 这时请用 yum install -y --nogpgcheck kubelet-1.15.12-0 kubeadm-1.15.12-0 kubectl-1.15.12-0安装
(3)查看kubeadm的版本(将来你要安装的K8S时请所有组件版本均保持一致!)
yum list kubeadm --showduplicates | sort -r

3.使用kubeadm工具初始化一套k8s集群

kubeadm init --kubernetes-version=v1.15.12 --image-repository registry.aliyuncs.com/google_containers  --pod-network-cidr=10.244.0.0/16 --service-cidr=10.254.0.0/16
使用kubeadm初始化集群时,存在以下几个优点:
[init] 
使用初始化的K8S版本。
[preflight] 
主要是做安装K8S集群的前置工作,比如下载镜像,这个时间取决于你的网速。
[certs] 
生成证书文件,默认存储在"/etc/kubernetes/pki"目录。
[kubeconfig]
生成K8S集群的默认配置文件,默认存储在"/etc/kubernetes"目录。
[kubelet-start] 
启动kubelet,
    环境变量默认写入:"/var/lib/kubelet/kubeadm-flags.env"
    配置文件默认写入:"/var/lib/kubelet/config.yaml"
[control-plane]
使用静态的目录,默认的资源清单存放在:"/etc/kubernetes/manifests"。
此过程会创建静态Pod,包括"kube-apiserver","kube-controller-manager"和"kube-scheduler"
[etcd]
创建etcd的静态Pod,默认的资源清单存放在:""/etc/kubernetes/manifests"
[wait-control-plane] 
等待kubelet从资源清单目录"/etc/kubernetes/manifests"启动静态Pod。
[apiclient]
等待所有的master组件正常运行。
[upload-config] 
创建名为"kubeadm-config"的ConfigMap在"kube-system"名称空间中。
[kubelet]
创建名为"kubelet-config-1.22"的ConfigMap在"kube-system"名称空间中,其中包含集群中kubelet的配置
[upload-certs]
跳过此节点,详情请参考”--upload-certs"
[mark-control-plane]
标记控制面板,包括打标签和污点,目的是为了标记master节点。
[bootstrap-token]
创建token口令,例如:"kbkgsa.fc97518diw8bdqid"。
如下图所示,这个口令将来在加入集群节点时很有用,而且对于RBAC控制也很有用处。
[kubelet-finalize] 
更新kubelet的证书文件信息
[addons] 
添加附加组件,例如:"CoreDNS"和"kube-proxy”

4.创建管理员证书文件

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
温馨提示:
如下图所示,当我们执行上述3条命令后,就可以正常管理集群啦!

5.node节点加入到现有集群

kubeadm join 10.0.0.11:6443 --token cilukv.wj65qyznoh7uaauq \
    --discovery-token-ca-cert-hash sha256:e9ab9e4db7614f162b3caec087fa599a58e3794c3eace65ea8afab66e5dee33b

6.移除node节点

(1)驱逐这个node节点上的pod
kubectl drain k8s-node01 --delete-local-data --force --ignore-daemonsets
也可以通过打污点的方式驱赶Pod资源:
kubectl taint node k8s204.oldboyedu.com school=oldboyedu:NoExecute 
(2)删除这个node节点
kubectl delete node k8s155.oldboyedu.com
(3)在node节点执行如下命令
kubeadm reset -f
温馨提示:
运行"kubeadm reset -f"可还原“kubeadm init”或“kubeadm join”对此主机所做的任何更改;

3.kubeadm有关token的管理,有效防止token过期的场景

1.查看集群现有的token

通过上面的案例想必大家都已经清楚了token的作用,那一但token挂掉后,由该如何解决呢?
我们可以使用"kubeadm token --help"指令来查看有关token声明周期的管理。
kubeadm token list###查看当前的tocken

2.删除指定的token

kubeadm token delete [token-value]

温馨提示:
如下图所示,我们可以直接删除指定的token,详细信息请参考“kubeadm token delete --help”

3.创建topken

kubeadm token create --print-join-command
默认设置一个24h的token,并打印node节点加入集群的命令.
kubeadm token create --ttl 8760h ##设置一个一年的token.
kubeadm token create --ttl 0##设置一个永久的token.
详情请参考"kubeadm token create --help"

4.部署网络插件

1.K8S集群的网络插件概述

网络插件也是附加组件,集群如果想要正常通信,我们就必须任选其一进行部署。
其中flannel和calico这两款网络插件都是企业应用较为广泛的插件,此处我们以部署flannel网络插件进行展示!
像Kubernetes这样的平台假设每个容器 (pod) 在集群内都有一个唯一的、可路由的IP。该模型的优势在于它消除了共享单个主机IP所带来的端口映射复杂性。
Flannel负责在集群中的多个节点之间提供第3层IPv4网络。Flannel不控制容器如何与主机联网,只控制如何在主机之间传输流量。但是,flannel确实为Kubernetes提供了CNI插件以及与Docker集成的指南。
Flannel专注于网络。对于网络策略,可以使用Calico等其他项目。
推荐阅读:
https://kubernetes.io/docs/concepts/cluster-administration/addons
https://github.com/flannel-io/flannel#deploying-flannel-manually
https://docs.projectcalico.org/getting-started/kubernetes/quickstart

2.部署flannel网络插件

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
如果下载不下来添加hosts解析
185.199.111.133 raw.githubusercontent.com
温馨提示:
(1)如果网络不是特别好的小伙伴,可以考虑先把配置文件下载到本地哟;
(2)如果Pod始终处于"Pending"状态,请检查目标节点的docker和kubelet组件是否正常工作哟;
经过查看yaml不难发现,flannel插件是以daemonset形式部署的。

5.kubeadm部署的集群有关kubelet的自动补全功能

(1)安装bash-completion
yum -y install bash-completion 
source /usr/share/bash-completion/bash_completion  
(2)应用kubectl的completion到系统环境
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

6.部署dashboard服务

1.安装dashboard服务

因为笔者部署的是1.15版本的k8s集群,而k8s1.15要求的dashboard的版本为1.10.所以以1.10版本的dashboard为例进行部署
部署参考连接:https://github.com/kubernetes/dashboard/tree/v1.10.1

###下载官方的deployment文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
vi kubernetes-dashboard.yaml
#修改镜像地址
image: registry.aliyuncs.com/google_containers/kubernetes-dashboard-amd64:v1.10.1
#修改service类型为NodePort类型
spec:
  type: NodePort
  ports:
    - port: 443
      nodePort: 30001
      targetPort: 8443
kubectl create -f kubernetes-dashboard.yaml

2.访问web页面

#使用火狐浏览器访问https://10.0.0.12:30001
查看令牌:因为每创建一个sa用户都会生成对应的令牌
但是此时用这个令牌登录会发现权限不够,需要重新创建一个用户

3.创建一个管理员账户

vim dashboard_rbac.yaml 
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: kubernetes-dashboard
    addonmanager.kubernetes.io/mode: Reconcile
  name: admin
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kubernetes-dashboard-admin
  labels:
    k8s-app: kubernetes-dashboard
    addonmanager.kubernetes.io/mode: Reconcile
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin ###因为这规则在kubeadmin初始化就有了,所以直接引用
subjects:
- kind: ServiceAccount
  name: admin
  namespace: kube-system
此时再用新的tocken登录发现已经能查看全局资源了

4.解决谷歌浏览器无法访问问题

mkdir key && cd key
#生成证书
openssl genrsa -out dashboard.key 2048 
openssl req -new -out dashboard.csr -key dashboard.key -subj '/CN=10.0.0.11'
openssl x509 -req -in dashboard.csr -signkey dashboard.key -out dashboard.crt 
#删除原有的证书secret
kubectl delete secret kubernetes-dashboard-certs -n kube-system
#创建新的证书secret
kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kube-system
#查看pod
kubectl get pod -n kube-system
#删除pod,启动新pod生效
kubectl delete  pod -n kube-sytem  kubernetes-dashboard-7c697b776b-zph98

5.使用config登录页面

kubeconfig文件生成方法:
DASH_TOCKEN=$(kubectl get secret -n kube-system admin-token-mcqj5 -o jsonpath={.data.token}|base64 -d)
kubectl config set-cluster kubernetes --server=10.0.0.11:6443 --kubeconfig=/root/dashbord-admin.conf
kubectl config set-credentials admin --token=$DASH_TOCKEN --kubeconfig=/root/dashbord-admin.conf
kubectl config set-context admin --cluster=kubernetes --user=admin --kubeconfig=/root/dashbord-admin.conf
kubectl config use-context admin  --kubeconfig=/root/dashbord-admin.conf
然后将文件下载到电脑中,登录的时候选择这个文件即可

评论已关闭

登录

忘记密码 ?

切换登录

注册

鲁ICP备2021019243号-1