前言
Kubernetes的概念、架构、组件。介绍了namespace的概念和使用。
描述Kubernetes架构。
区分不同组件的功能。
查看master和node节点中有哪些组件。
创建namespace
一、Kubernetes 架构
node就是常说的worker节点。
1.Kubernetes是什么?
Kubernetes 是容器编排的软件。来自google公司。2015年发布 1.0版本
实现容器的自动管理。除k8s外还有openshift(redhat)等
k8s是一种开源的技术。它和openshif的关系是,openshift基于 k8s进行的封装。形成的产品

2.Kubernetes架构
node节点
就是常说的worker节点,数量取决于业务规模
master节点
做调度功能,不运行,但会运行系统容器(调度管理功能的容器)。
master节点至少3个节点(奇数,投票)

3 master节点
- Kube-apiserver
kube-apiserver对外暴露了Kubernetes API。它是的 Kubernetes 前端控制层。它被设计为水平扩展,即通过部署更多实例来缩放。
api用来接收用户的请求,所有的指令都发给kube-apiserver。kube-apiserver宕掉所有指令都无法接收。 - Etcd
etcd 用于 Kubernetes 的后端存储。所有集群数据都存储在此处,始终为您的 Kubernetes 集群的 etcd 数据提供备份计划。
1)Etcd是一个nosql数据库,key-value.存储k8s的元数据
2)Etcd还是一个分布式协同系统(Etcd、zookeeper) -
具备选主功能,采用的raft算法(同paxos算法功能一样),zookeeper用的是ZAB协议(ZooKeeper Atomic Broadcast)基于paxos算法
raft算法的动画演示 http://thesecretlivesofdata.com/raft/ - 解决数据同步问题
- 提供分布式锁机制
- kube-controller-manager
运行控制器,它们是处理集群中常规任务的后台线程。逻辑上,每个控制器是一个单独的进程,但为了降低复杂性,它们都被编译成独立的可执行文件,并在单个进程中运行。
用来控制worker干活 - kube-scheduler
监视没有分配节点的新创建的 Pod,选择一个节点供他们运行。
用来调度任务,选择用哪个worker进行工作。预选+优选
以上组件部署方式有2种
1) 组件直接部署在linux系统中,以进程的方式部署在系统中。一般以源码部署,早期方式
2)组件以pod(容器)的方式进行部署,主流的部署方式。
4 node节点
- Kube-proxy
Kube-proxy用于管理service的访问入口,包括集群内pod到service的访问和集群外访问service。
用于自动完成防火墙的更改和端口的映射,如httpd服务8080端口映射到80端口
如果master组件以pod方式部署,则Kube-proxy同样要运行在master节点-主流方式
如果master组件以进程方式部署,则Kube-proxy不需要运行在master节点 - Kubelet
Kubelet是在集群内每个节点中运行的一个代理,用于保证pod的运行
负责监控pod,管理pod的生命周期,负责与master做交互
如果master组件以pod方式部署,则Kubelet同样要运行在master节点-主流方式 - 容器引擎
通常使用docker来运行容器,也可使用rkt等做为替代方案。
k8s 本身是没有容器技术的,它只是用来管理容器的。他需要与容器技术对接,因此需要有容器引擎。通常使用docker。
如果master组件以pod方式部署,则容器引擎同样需要运行在master中
5.推荐Add-ons(插件)
- 除了上述组件外,kubernetes使用中通常需要一些额外的组件实现特定功能,常
用的Add-ons包括:
Core-dns:为整个集群提供DNS服务
早期版本用Cube-dns
Ingress Controller:为service提供外网访问入口
使得外部可以访问内部pod
Dashboard: 提供图形化管理界面
Heapster 提供集群资源监控
Heapster比较老了,现在多用metric来进行健康检查(包括普罗米修斯-Prometheus是一套开源的监控&报警&时间序列数据库的组合。适合监控Docker容器。因为Kubernetes的流行带动了Prometheus的发展)
Flannel:为kubernetes提供方便的网络规划服务
最灵活,最简单,最容易理解
6.Kubeadm
- Kubeadm是社区主推的快速创建Kubernetes集群工具。
- kubeadm 通过执行必要的操作来启动和运行一个最小可用的集群。它被故意设计
为只关心启动集群,而不是之前的节点准备工作。同样的,诸如安装各种各样值得
拥有的插件,例如 Kubernetes Dashboard、监控解决方案以及特定云提供商的
插件,这些都不在它负责的范围。
Master节点:kubeadm init,快速初始化安装主节点组件
Node节点:kubeadm join,将从节点加入集群
安装顺序要求先安装master节点,后安装worker节点。
6.1 部署Kubeadmin
1)目标:部署1台master + 2 台 worker节点
2c4G40G(必须2c),使用3台centos 7.6 虚拟机进行实验
| 角色 | 主机名 | ip |
|---|---|---|
| master | k8s-master | 192.168.227.10 |
| worker1 | k8s-node1 | 192.168.227.11 |
| worker2 | k8s-node2 | 192.168.227.12 |
| 软件版本 | 版本号 |
|---|---|
| kube-apiserver | v1.14.1 |
| kube-controller-manager | v1.14.1 |
| kube-scheduler | v1.14.1 |
| kube-proxy | v1.14.1 |
| pause | v3.1 |
| etcd | v3.3.10 |
| coredns | v1.3.1 |
| docker | 18.06.2-ce |
2)虚拟机节点环境初始化
step1 : 分别在3台虚拟机设置主机名称
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
step2 : 分别在3台节点上配置主机映射
cat <<EOF >> /etc/hosts
192.168.227.10 k8s-master
192.168.227.11 k8s-node1
192.168.227.12 k8s-node2
EOF
setp3 :3台虚拟机节点基础配置
1)停用防火墙(防止后续实验中k8s-master和worker通信异常)
systemctl stop firewalld
systemctl disable firewalld
2)关闭swap(kubernetes不支持swap)
swapoff -a
sed -i 's/.swap./#&/' /etc/fstab 《==== fstab中注释掉swap
3)加载br_netfilter
br_netfilter 用于做网桥的网络转发。详细解释见https://www.icode9.com/content-4-823662.html
modprobe br_netfilter
4)添加配置内核参数
该配置的解释详见 https://zhuanlan.zhihu.com/p/374919190
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
5)加载配置
sysctl -p /etc/sysctl.d/k8s.conf
输入如下命令,查看是否生成相关文件(bridge-nf-call-ip6tables bridge-nf-call-iptables)
ls /proc/sys/net/bridge
[root@k8s-node1 ~]# ls /proc/sys/net/bridge
bridge-nf-call-arptables bridge-nf-call-ip6tables bridge-nf-call-iptables bridge-nf-filter-pppoe-tagged bridge-nf-filter-vlan-tagged bridge-nf-pass-vlan-input-dev
[root@k8s-node1 ~]#
6)输入如下命令,添加Kubernetes的国内yum源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.huaweicloud.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.huaweicloud.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.huaweicloud.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
#安装依赖包以及相关工具
yum -y install epel-release
yum -y install yum-utils device-mapper-persistent-data lvm2 net-tools conntrack-tools wget vim ntpdate libseccomp libtool-ltdl tree
#配置ntp服务(配置完后建议重启一次)
systemctl enable ntpdate.service
echo '*/30 * * * * /usr/sbin/ntpdate time7.aliyun.com >/dev/null 2>&1' > /tmp/crontab2.tmp
crontab /tmp/crontab2.tmp
systemctl start ntpdate.service
#在所有节点安装docker ce
yum-config-manager --add-repo [https://download.docker.com/linux/centos/docker-ce.repo](https://download.docker.com/linux/centos/docker-ce.repo)
yum -y install docker-ce-18.06.2.ce
#使用国内docker image镜像源加速镜像拉取速度
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s [http://f1361db2.m.daocloud.io](http://f1361db2.m.daocloud.io)
#启动docker
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
systemctl status docker
[root@k8s-node1 ~]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since 一 2022-01-24 10:32:50 CST; 18min ago
Docs: https://docs.docker.com
7)将后续安装需要用到的配置文件下载到本地root home目录下并解压
cd /root
wget https://obs-k8s.obs.cn-north-4.myhuaweicloud.com/K8s.zip
yum install unzip
unzip K8s.zip
[root@k8s-master tmp]# ll
总用量 18600
-rw-r--r--. 1 root root 64 1月 21 15:23 crontab2.tmp
-rw-r--r--. 1 root root 19032369 1月 24 12:10 K8s.zip
-rw-r--r--. 1 root root 1964 1月 21 14:58 PrepInstall.sh
-rw-r--r--. 1 root root 1958 1月 21 14:58 PrepInstall.sh.bk
drwx------. 3 root root 17 1月 24 10:32 systemd-private-cb770c89c3f143ffbbfcae862290b305-vgauthd.service-jDUmEa
drwx------. 3 root root 17 1月 24 10:32 systemd-private-cb770c89c3f143ffbbfcae862290b305-vmtoolsd.service-SXlI4b
drwxr-xr-x. 2 root root 192 8月 1 2019 UAT
[root@k8s-master tmp]#
8)编辑拉取Kubernetes镜像的脚本(3个节点均需执行)
国内无法访问gcr.io,这时需要使用如下命令从docker hub拉取相应镜像,尽量使用相匹配的镜像安装,具体拉取的镜像版本搭配,可以在官网搜索,这里对应版本见上文环境准备和规划中的软件版本描述。使用vi编辑器将以下脚本内容复制进文件中。
#!/bin/bash images=( kube-apiserver:v1.14.1 kube-controller-manager:v1.14.1 kube-scheduler:v1.14.1 kube-proxy:v1.14.1 pause:3.1 etcd:3.3.10 coredns:1.3.1 flannel:v0.11.0-amd64
kibana-oss:v6.6.1 ) a=0 for imageName in [${images[@]}](mailto:$%7bimages[@]%7d) ; do docker pull oceancloud/$imageName let a++ if [ "$a" -eq 9 ] ; then docker tag oceancloud/$imageName docker.elastic.co/kibana/kibana-oss:6.6.1 elif [ "$a" -eq 8 ] ; then docker tag oceancloud/$imageName quay.io/coreos/$imageName
else
docker tag oceancloud/$imageName k8s.gcr.io/$imageName fi done
9)安装kubelet、kubeadm、kubectl(3个节点都安装)
kubelet:pod的生命周期管理
kubeadm:命令集:用于部署的命令安装时候使用的命令
kubectl:命令集:用于管理的命令
yum -y install kubelet-1.14.1-0.x86_64
yum -y install kubeadm-1.14.1-0.x86_64
yum -y install kubectl-1.14.1-0.x86_64
systemctl enable kubelet
添加Kubernetes命令补全功能(在K8s-master节点添加即可)
yum -y install bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc