第144天学习打卡( Kubernetes DaemonSet k8s集群组件 k8s的核心概念)

DaemonSet

DaemonSet确保全部(或者一些)Node上运行一个Pod的副本。当有Node加入集群时,也会为他们新增一个Pod。当有Node从集群移除时,这些Pod也会被回收。删除Daemonet将会删除它创建的所有Pod。

使用DaemonSet的一些典型的用法:

  • 运行集群存储daemon,例如在每个Node上运行glusterd、ceph。
  • 在每个Node上运行日志收集daemon, 例如fluentd、logstash。
  • 在每个Node上运行监控daemon,例如Prometheus Node Exporter

Job

负责批处理任务,即仅执行一次的任务, 它保证批处理任务的一个或多个Pod成功结束

Cron Job

Cron Job管理基于时间的Job,即:

  • 在给定时间点只运行一次
  • 周期性地在给时间点运行

服务发现

image-20210601202441327

网络通讯模式-1

kubernetes的网络模型假定了所有Pod都在一个可以直接连通的扁平的网络空间中,这在GCE(Google Compute Engine)里面是现成的网络模型,Kubernetes假定这个网络已经存在。而私有云里搭建Kubernetes集群,就不能假定这个网络已经存在了,我们需要自己实现这个网络假设,将不同节点上的Docker容器之间的互相访问先打通,然后运行Kubernetes。

网络通讯模式-2

同一个Pod内的多个容器之间:lo

各Pod之间的通讯:Overlay Network

Pod与Service之间的通讯:各节点的Iptables规则。

网络解决方案 Kubernetes + Flannel -1

Flannel是CoreOS团队针对K8S设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址。而且它还能在这些IP地址之间建立一个覆盖网络(Overlay Network),通过这个覆盖网络,将数据包原封不动的传递到目标容器内。

ETCD之Flannel 提供说明:

存储管理Flannel可分配的IP地址段资源

监控ETCD中每个Pod的实际地址,并在内存中建立维护Pod节点路由表

不同情况下网络通信方式

同一个Pod内部通讯:同一个Pod共享一个网络命名空间,共享同一个Linux协议栈

Pod1和Pod2

  • Pod1与Pod2不在同一台主机,Pod的地址是与docker0在同一个网段的,但docker0网段与宿主机网卡是两个完全不同的IP网段,并且不同Node之间的通信只能通过宿主机的物理网卡进行。将Pod的IP和所在Node的IP关联起来,通过这个关联让Pod可以互相访问
  • Pod1与Pod2在同一台机器,由Docker0网桥直接转发请求至Pod2,不需要经过Flannel

Pod至Service的网络:目前基于性能考虑,全部为iptables维护和转发

Pod到外网:Pod向外网发送请求,查找路由表,转发数据包到宿主机的网卡,宿主网卡完成路由选择后,iptables执行Masquerade,把源IP更改为宿主网卡的IP,然后向外网服务器发送请求

外网访问Pod: Service

组件通讯示意图

image-20210601211649482

K8s集群架构组件

image-20210601150604849

  • Master(主控节点) 和node(工作节点)
  • (1)Master组件
    • apiserver: 集群统一入口,以restful方式,交给etc存储
  • scheduler
    • 节点调度,选择node节点应用部署
  • controller-manager
    • 处理集群中常规后台任务,一个资源对应一个控制器
  • etcd
    • 存储系统,用于保存集群相关的数据
  • (2)node组件
  • kubeelet
    • master派到node节点代表,管理本机容器
  • kube-proxy
    • 提供网络代理,负载均衡等操作

K8s核心概念

1.Pod

  • 最小部署单元
  • 一组容器的集合
  • 共享网络
  • 生命周期是短暂的

2.controller

  • 确保预期的pod副本数量
  • 无状态应用部署
  • 有状态应用部署(需要特定的条件才可以使用)
  • 确保所有的node运行同一个pod
  • 一次性任务和定时任务

3.service

  • 定义一组pod的访问规则

1.搭建k8s环境平台的规划

平台规划

单master集群

image-20210601153153520

多master集群

image-20210601153333713

2.服务器硬件配置要求

测试环境:

image-20210601153547944

生成环境:更高要求

3.搭建k8s集群部署方式

1.前置知识

目前生产部署kubernetes集群主要有两种方式:

(1)kubeadm

Kubeadm是一个K8s部署工具,提供kubeadm init和kubeadm join用于快速部署kubernetes集群,这个工具能通过两条指令完成kubernetes集群的部署:

第一,创建一个Master节点 kubeadm init

第二,将Node节点加入到当前集群中 $kubeadm join <Master 节点的IP和端口>

安装要求

在开始之前,部署k8s集群机器需要满足一下几个条件:

-- 一台或者多台机器,操作系统CentOS7.x-84_x64

-- 硬件配置:2GB或更多RAM, 2个CPU或者更多CPU,硬盘30GB或更多

-- 集群中所有机器之间网络互通

-- 可以访问外网,需要拉取镜像

-- 禁止swap分区

image-20210601161400842

image-20210601161731090

image-20210601162113327

image-20210601162207318

image-20210601162612313

image-20210601162657869

image-20210601162843066

image-20210601162939861

image-20210601163108245

image-20210601163203825

image-20210601163627245

image-20210601163716686

image-20210601163807198

image-20210601163830848

image-20210601163903836

按照以上步骤创建另外两个node节点:

image-20210601164348564

使用这个在一个命令行输入的,三个窗口都会同时执行

image-20210601165109276

image-20210601165159936

#关闭防火墙
 systemctl stop firewalld  #临时关闭
 systemctl disable firewalld #永久关闭
 
 #关闭selinux
 sed -i 's/enforcing/disabled/' /etc/selinux/config #永久
 setenforce 0 #临时
 
 #关闭swap
 swapoff -a #临时
 sed -ri 's/.*swap.*/#&/' /etc/fstab #永久
 
 #根据规划设置主机名
 hostnamectl set-hostname <hostname>
 
 #在master添加hosts
cat >> /etc/hosts << EOF
47.108.197.198 k8smaster
47.108.249.149 k8snode1
47.109.18.54 k8snode2
EOF
 
 # 将桥接的IPV4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
 sysctl --system #生效
 #时间同步
 
 yum install ntpdate -y
 ntpdate time.windows.com

image-20210601183105588

(三个端口都要执行这个命令)

#yum安装gcc相关环境(需要确保虚拟机可以上外网)
yum -y install gcc
yum -y install gcc-c++

#1.卸载旧的版本
 yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
  # 2.需要的安装包
  yum install -y yum-utils
  # 3.设置镜像的仓库
  yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
  
 # 建议安装阿里云 
  yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#4更新yum软件包索引
 yum makecache fast


# 5安装docker相关的内容   docker-ce 社区   ee企业版
 yum install -y docker-ce docker-ce-cli containerd.io
 #6 启动docker
 systemctl start docker
 #7.使用 docker version 查看是否安装成功


# 8 配置镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://g6yrjrwf.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

#docker info

添加阿里云YUM软件源(三个端口都要执行这个命令)

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=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

安装kubeadm, kubelet和kubectl(三个端口都要执行这个命令)

 yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
systemctl enable kubelet  #开机启动

部署Kubernetes Master(注意这个命令只能在master里面执行 前面的命令三个端口都要执行)

 kubeadm init \
  --apiserver-advertise-address=47.108.197.198 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.18.0 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16
 
kubeadm init \
  --apiserver-advertise-address=47.108.197.198 \ #当前master的ip
  --image-repository registry.aliyuncs.com/google_containers \ #镜像
  --kubernetes-version v1.18.0 \ #指定当前版本
  --service-cidr=10.96.0.0/12 \ #(这个ip和自己的Ip不冲突就行)
  --pod-network-cidr=10.244.0.0/16  #(这个ip和自己的Ip不冲突就行)

出现的问题:

Unfortunately, an error has occurred:
	timed out waiting for the condition

This error is likely caused by:
	- The kubelet is not running
	- The kubelet is unhealthy due to a misconfiguration of the node in some way (required cgroups disabled)

If you are on a systemd-powered system, you can try to troubleshoot the error with the following commands:
	- 'systemctl status kubelet'
	- 'journalctl -xeu kubelet'

Additionally, a control plane component may have crashed or exited when started by the container runtime.
To troubleshoot, list all containers using your preferred container runtimes CLI.

Here is one example how you may list all Kubernetes containers running in docker:
	- 'docker ps -a | grep kube | grep -v pause'
	Once you have found the failing container, you can inspect its logs with:
	- 'docker logs CONTAINERID'
	
error execution phase wait-control-plane: couldn't initialize a Kubernetes cluster
To see the stack trace of this error execute with --v=5 or higher

目前还没有解决

(2)二进制包

从github下载发行版的二进制包, 手动部署每个组件,组成kubernetes集群。

kubeadm降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制部署kubernetes集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护。

B站学习网址:尚硅谷Kubernetes教程(K8s新版已上传,推荐观看)_哔哩哔哩_bilibili

k8s教程由浅入深-尚硅谷_哔哩哔哩_bilibili

posted @ 2021-06-01 21:21  豆豆tj  阅读(207)  评论(0)    收藏  举报