Kubernetes(2) 搭建Kubernetes集群

本文详细介绍Kubernetes集群的搭建过程,包括使用kubeadm工具进行Master节点和Worker节点的部署,网络插件的配置,以及如何通过Taint/Toleration机制调整Master节点执行Pod的策略。

0. 回顾Kubernetes架构

kubeadm使用简介

  • apt-get install kubeadm( 宿主机上安装kubeadm,kubelet,kubectl)
  • Kubeadm init
    • 做一些列的检查工作,确认是否可以部署k8s,被称为Preflight checks
  • 生成k8s对外提供服务所需的各种证书和对应的目录,注意,我们可以选择不让kubeadm生成这些证书,而是拷贝现有证书到/etc/kubernetes/pki/目录下
    • 为其他组件生成访问kube-apiserver所需的配置文件,存储路径是/etc/kubernets/xxx.conf
    • 为master组件,kube-apiserver,kube-controller-manager,kube-scheduler,生成pod配置文件(yaml文件),被保存在/etc/kubernetes/mainfests下
    • 在4中节点上的kubelet启动后,通过static pod的方式加载4中目录下的pod yaml文件,并启动kube-apiserver这些master组件
    • kubeadm会生成一个etcd的pod yaml文件,同样通过static pod的方式启动etcd,所以master组件的pod yaml文件如下
      $ ls /etc/kubernetes/manifests/
      etcd.yaml kube-apiserver.yaml kube-controller-manager.yaml kube-scheduler.yaml
    • 检查Locallhost:6443/healthz 这个健康检查url,等待master组件完全运行起来
    • 为集群生成bootstrap token,为之后kubeadm join命令做验证
    • 将master节点的重要信息,通过configmap的方式保存在etcd中,共后续安装Node节点使用
    • 安装默认插件,k8s默认安装kube-proxy和dns,提供集群发现和dns功能。
  • Kubeadm join
    • 新的worker节点上kubeadm发起一次“不安全的”请求道kube-apiserver获取etcd中存储的cluster-info中的地址,端口,证书,bootstrap token扮演了安全验证的角色
    • 通过证书建立起worker节点和master节点的 关系

1. 在所有节点上安装Docker和kubeadm

$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
$ cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
$ apt-get update
$ apt-get install -y docker.io kubeadm

通过这个步骤,kubeadm、kubelet、kubectl、kubernetes-cni这几个二进制文件都会被自动安装好。

2. 部署Kubernetes Master

2.1 编写kubeadm.yaml配置文件

示例如下:

apiVersion: kubeadm.k8s.io/v1alpha1
kind: MasterConfiguration
controllerManagerExtraArgs:
  horizontal-pod-autoscaler-use-rest-clients: "true"
  horizontal-pod-autoscaler-sync-period: "10s"
  node-monitor-grace-period: "10s"
apiServerExtraArgs:
  runtime-config: "api/all=true"
kubernetesVersion: "stable-1.11"

执行kubeadm init --config kubeadm.yaml, 稍等一会儿,部署完成后,kubeadm会生成一条指令,如下

kubeadm join 10.168.0.2:6443 --token 00bwbx.uvnaa2ewjflwu1ry --discovery-token-ca-cert-hash sha256:00eb62a2a6020f94132e3fe1ab721349bbcd3e9b94da9654cfe15f2985ebd711

记录下来上面这条指令,这是用来给这个master节点添加更多工作节点(worker)的命令。

通过kubectl describe node master和kubectl get pods -n kube-system查看到的是因为网络相关的配置没有进行导致nodenotready

2.2 安全文件配置

此外,Kubernetes默认需要加密方式访问。所以,需要把刚刚部署生成的Kubernetes集群的安全配置文件,保存到当前用户的.kube目录下,kubectl默认会使用这个目录下信息授权访问Kubernetes集群。

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

2.3 检查节点状态

  • kubectl describe node master
$ kubectl describe node master

...
Conditions:
...

Ready   False ... KubeletNotReady  runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
  • kubectl get pods -n kube-system
$ kubectl get pods -n kube-system

NAME               READY   STATUS   RESTARTS  AGE
coredns-78fcdf6894-j9s52     0/1    Pending  0     1h
coredns-78fcdf6894-jm4wf     0/1    Pending  0     1h
etcd-master           1/1    Running  0     2s
kube-apiserver-master      1/1    Running  0     1s
kube-controller-manager-master  0/1    Pending  0     1s
kube-proxy-xbd47         1/1    NodeLost  0     1h
kube-scheduler-master      1/1    Running  0     1s

可以看出,是CoreDNS、kube-controller-manager等依赖网络的Pod都处于Pending状态,即调度失败。

3. 部署容器网络插件

部署网络插件,以Weave为例,

$ kubectl apply -f https://git.io/weave-kube-1.6

部署完成后,重新kubectl get pods -n kube-system检查Pod的状态,全部都启动成功,保持running状态。
目前,Kubernetes支持容器网络插件,使用的是CNI的通用接口,也是当前容器网络的实施标准,市面上Flannel、Calico、Canal、Romana等一键部署项目都是通过CNI接口Kubernetes。

至此,Master节点部署完成,如果只需要一个Kubernetes,现在就可以使用了,但是默认情况下,Kubernetes的Master节点是不能运行用户Pod的,所以还需要额外做一个小操作,最后介绍。

4. 部署Kubernetes Worker节点

master节点和worker节点几乎是相同的,都运行着一个kubulet的组件。唯一的区别是Master节点会额外在kubeadm init过程中自动运行kube-apiserver, kube-scheduler, kube-controller-manager。
分两步执行部署:

  • 在所有节点上执行第一小节“安装kubeadm和Docker”
  • 执行部署Master节点是生成的kubeadm join指令
$ kubeadm join 10.168.0.2:6443 --token 00bwbx.uvnaa2ewjflwu1ry --discovery-token-ca-cert-hash sha256:00eb62a2a6020f94132e3fe1ab721349bbcd3e9b94da9654cfe15f2985ebd711

5. 通过Taint/Toleration调整Master执行Pod的策略

[规定]默认情况下Master节点是不运行Pod。
[实现方式]Taint/Toleration机制
Taint(污点):通过命令给node节点加上Taint之后,所有的Pod就不能再在这个node上运行了。—Pod有洁癖
Toleration(容忍):个别Pod可以特别声明自己可以容忍这个污点,那么就可以在对应打了污点的节点上运行。
[Taint使用方法]

$ kubectl taint nodes node1 foo=bar:NoSchedule

这样在node1上上城了一个键值对格式的Taint,其中里面的NoSchedule字段,意味着这个污点只会在调度新的Pod的时候产生作用,不会影响已经运行在Node1上的POD。
这么看来,给Node打上Taint的内容即foo=bar:NoSchedule部分还是有多种使用方法,这个还是要再研究下。
[Toleration使用方法]
在Pod对应的Yaml文件中加入字段:

apiVersion: v1
kind: Pod
...
spec:
  tolerations:
  - key: "foo"
    operator: "Equal"
    value: "bar"
    effect: "NoSchedule"

6. 部署Dashboard可视化插件

安装可视化插件并查看对应Pod详情

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
$ kubectl get pods -n kube-system
kubernetes-dashboard-6948bdb78-f67xk   1/1       Running   0          1m

注意,dashboard是一个web service,1.7 版本之后dashboard项目部署完成后,只能通过Proxy在本地访问,需要用到Ingress。

7. 部署容器存储插件

容器持久化存储是解决容器的典型特征“无状态”的。
通过网络或者其他机制的远程数据卷,将其和容器中某个目录进行绑定挂载,进而使得在容器中创建的文件能够保存在远程存储服务器上、或以分布式的方式保存在多个节点上。
可用的,如Ceph,NFS,GlusterFS等,都可以为Kubernetes提供持久化存储能力。

代码转载自:https://pan.quark.cn/s/9cde95ebe57a 横道图,亦称为甘特图,是一种可视化的项目管理手段,用于呈现项目的进度安排和时间框架。 在信息技术领域,特别是在项目执行与软件开发范畴内,横道图被普遍采用来监控作业、配置资源以及保障项目能按时交付。 此类图表借助水平条带图示来标示各个任务的起止时间点,使项目成员与管理者可以明确掌握项目的整体发展状况。 周期表或可指代计算机科学中的“作业调度周期表”或“资源配置周期表”。 在计算机系统中,作业调度是一项核心功能,它规定了哪个进程或线程能够在中央处理器上执行以及执行的具体时长。 周期表有助于系统管理者洞察作业的执行频率和资源使用状况,进而提升系统的运作效能和响应能力。 不仅如此,周期表也可能意指数据处理或研究中的周期性文档,如在金融分析中按期更新的市场信息文档。 在压缩文件“横道图,周期表.zip”内含的“横道图,周期表.doc”文件,很可能是对某个项目或任务管理的详尽阐述,涵盖利用横道图来制定和展示项目的时间进程,以及可能牵涉的周期性作业调度或资源配置情形。 文件或许包含以下部分:1. **项目简介**:阐述项目的目标、范畴、预期成效及参与项目的团队成员。 2. **横道图详述**:具体列出了项目中的各项任务,每个任务的启动与终止时间,以及它们之间的关联性。 横道图通常涵盖关键节点,这些节点是项目中的重要事件,象征重要阶段的实现。 3. **任务配置**:明确了每个任务的责任归属,使项目成员明晰自己的职责和截止日期。 4. **进展更新**:若文件是动态维护的,可能会记录项目的实际进展与计划进展的对比,有助于识别延误并调整计划。 5. **周期表探讨**:深入说明了周期性作业的调度,如定期的会议、报告递交、...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值