部署k8s集群+k8s架构,基础概念

部署k8s集群

基本环境:CentOS 7.6
CPU:双核
MEM: 2G

环境 IP地址
master 192.168.1.20
node01 192.168.1.21
node02 192.168.1.22

这里安装的k8s版本为1.15.0版本,docker部署安装指定版本18.9.0
3个node节点时间必须同步
[root@localhost ~]# yum -y install ntp
[root@localhost ~]# systemctl start ntpd
[root@localhost ~]# ntpstat
unsynchronised
polling server every 64 s
[root@localhost ~]# date
修改主机名
[root@localhost ~]# hostnamectl set-hostname master
[root@localhost ~]# bash
[root@localhost ~]# hostnamectl set-hostname node01
[root@localhost ~]# bash
[root@localhost ~]# hostnamectl set-hostname node02
[root@localhost ~]# bash
关闭防火墙和selinux
[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
[root@master ~]# setenforce 0
[root@master ~]# vim /etc/selinux/config
清空iptables
[root@master ~]# iptables -F
[root@master ~]# iptables-save
3台虚拟机全部禁用swap
[root@master ~]# swapoff -a
[root@master ~]# vim /etc/fstab
#/dev/mapper/centos-swap swap swap defaults 0 0
//验证swap确实关闭
[root@master ~]# free -h
3个节点编辑对应域名解析
[root@master ~]# vim /etc/hosts
在这里插入图片描述
开启免密传输
[root@master ~]# ssh-keygen -t rsa (连点3下回车)
[root@master ~]# ssh-copy-id root@node01
[root@master ~]# ssh-copy-id root@node02
打开iptables桥接功能
[root@master ~]# vim /etc/sysctl.conf
在这里插入图片描述
[root@master ~]# sysctl -p (另外两台也要做)
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
注:如果提示没有文件夹或目录输入下面命令
[root@master ~]# modprobe br_netfilter

到此基本环境准备完毕,需要在各节点上准备docker以及kubernetes的yum源,这里推荐使用阿里云的yum源先来master节点上操作

阿里云yum源: https://developer.aliyun.com/mirror/
添加docker的yum源

#1.安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
#2.添加软件源信息
sudo yum-config-manager --add-repohttps://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#3.更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
#4.开启Docker服务
sudoservice docker start

添加kubernetes的yum源


cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[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

将yum源文件复制到其他两个node节点
cd /etc/yum.repo.d
scp docker-ce.repo kubernetes.repo node01:/etc/yum.repos.d/
scp docker-ce.repo kubernetes.repo node02:/etc/yum.repos.d/
配置docker加速器
[root@master ~]# vim /etc/docker/daemon.json
{
“registry-mirrors”: [“https://szvvaomn.mirror.aliyuncs.com”]
}
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl restart docker
查看docker 版本为: 18.09.0,这是因为k8s:1.15.0建议使用的docker的最高版本
[root@master ~]# yum install -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0
[root@master ~]# systemctl enable docker
[root@master ~]# systemctl enable kubelet
这里注意,master节点部署了kubectl、kubelet、kuberadm三个组件,其他Node节点,只需部署kubelet、kuberadm即可
[root@node01 ~]# yum install -y kubelet-1.15.0 kubeadm-1.15.0
[root@node01 ~]# systemctl enable docker
[root@node01 ~]# systemctl enable kubelet
[root@node02 ~]# yum install -y kubelet-1.15.0 kubeadm-1.15.0
[root@node02 ~]# systemctl enable docker
[root@node02 ~]# systemctl enable kubelet

至此,准备工作做完,可以开始初始化,可是由于国内网络环境限制,我们不能直接从谷歌的镜像站下载镜像,这时,需要我们手工从docker镜像站下载镜像,然后重新命名,这里用脚本来实现。注意如果你想自己下载镜像的话,下边这些命令下载镜像的版本,不适用用于k8s1.15版本
下载
docker pull mirrorgooglecontainers/kube-apiserver:v1.14.1
docker pull mirrorgooglecontainers/kube-controller-manager:v1.14.1
docker pull mirrorgooglecontainers/kube-scheduler:v1.14.1
docker pull mirrorgooglecontainers/kube-proxy:v1.14.1
docker pull mirrorgooglecontainers/pause:3.1
docker pull mirrorgooglecontainers/etcd:3.3.10
docker pull coredns/coredns:1.3.1
改名
docker tag mirrorgooglecontainers/kube-proxy:v1.14.1k8s.gcr.io/kube-proxy:v1.14.1
docker tag mirrorgooglecontainers/kube-scheduler:v1.14.1k8s.gcr.io/kube-scheduler:v1.14.1
docker tag mirrorgooglecontainers/kube-apiserver:v1.14.1k8s.gcr.io/kube-apiserver:v1.14.1
docker tag mirrorgooglecontainers/kube-controller-manager:v1.14.1 k8s.gcr.io/kube-controller-manager:v1.14.1
docker tag mirrorgooglecontainers/etcd:3.3.10k8s.gcr.io/etcd:3.3.10
docker tag coredns/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1
docker tag mirrorgooglecontainers/pause:3.1k8s.gcr.io/pause:3.1
删除
docker rmi mirrorgooglecontainers/kube-apiserver:v1.14.1
docker rmi mirrorgooglecontainers/kube-controller-manager:v1.14.1
docker rmi mirrorgooglecontainers/kube-scheduler:v1.14.1
docker rmi mirrorgooglecontainers/kube-proxy:v1.14.1
docker rmi mirrorgooglecontainers/pause:3.1
docker rmi mirrorgooglecontainers/etcd:3.3.10
docker rmi coredns/coredns:1.3.1
这里我已经下载好了,只需要导入相应的镜像即可
[root@master ~]# ls
base-image.zip
[root@master ~]# unzip base-image.zip
[root@master ~]# ls
base-image.zip 基础镜像
这里我们给镜像改个名字
[root@master ~]# mv 基础镜像/ images
[root@master ~]# cd images/
[root@master images]# ls
coredns-1-3-1.tar kube-controller-1-15.tar
etcd-3-3-10.tar kube-proxy-1-15.tar
flannel-0.11.0.tar kube-scheduler-1-15.tar
kube-apiserver-1-15.tar pause-3-1.tar
导入镜像
[root@master ~]# cat images.sh
#!/bin/bash
for i in /root/images/*
do
docker load < $i
done
echo -e “\e[1;31m导入完成\e[0m”
//或者直接用命令也可以
[root@master ~]# for i in images/*;do docker load < $i;done
node01和node02节点只需导入3个镜像即可
[root@master images]# scp kube-proxy-1-15.tar flannel-0.11.0.tar pause-3-1.tar node01:images/
[root@master images]# scp kube-proxy-1-15.tar flannel-0.11.0.tar pause-3-1.tar node02:images/
注意:node01和node02要有images这个目录
[root@node01 ~]# mkdir images
[root@node02 ~]# mkdir images
导入
[root@node01 images]# docker load < flannel-0.11.0.tar && docker load < kube-proxy-1-15.tar && docker load < pause-3-1.tar
[root@node02 images]# docker load < flannel-0.11.0.tar && docker load < kube-proxy-1-15.tar && docker load < pause-3-1.tar
初始化集群
[root@master ~]# kubeadm init --kubernetes-version=v1.15.0 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
在这里插入图片描述

[root@master images]# mkdir -p $HOME/.kube
[root@master images]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master images]# sudo chown ( i d − u ) : (id -u): (idu):(id -g) $HOME/.kube/config

[root@master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
master NotReady master 14m v1.15.0
可以看出master的状态是未就绪(NotReady),之所以是这种状态是因为还缺少一个附件flannel,没有网络各Pod是无法通信的

添加网络组件(flannel),组件flannel可以通过https://github.com/coreos/flannel中获取
[root@master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
注意:这里可能因为网速问题下载慢或者下载失败,所以我们用提前准备好的kubectl-flnnel.yaml文件
[root@master images]# ls
kube-flannel.yml
运行
[root@master images]# kubectl apply -f kube-flannel.yml
再次查看集群节点状态

[root@master images]# kubectl get node
NAME STATUS ROLES AGE VERSION
master Ready master 24m v1.15.0
以上是主节点的安装部署,然后个node几点的安装,和加入集群,这里注意,验证,node节点已经准备好了相关的镜像
注意:现在我们就需要用到上面图片里记住的长条命令在node01和node02执行
[root@node01 ~]# kubeadm join 192.168.1.20:6443 --token 2blavc.curlpgmb5ulng8za --discovery-token-ca-cert-hash sha256:a2196011d5fddc13d0f05139a79f903681332f0602c2807797353a0052e3802a

[root@node02 ~]# kubeadm join 192.168.1.20:6443 --token 2blavc.curlpgmb5ulng8za --discovery-token-ca-cert-hash sha256:a2196011d5fddc13d0f05139a79f903681332f0602c2807797353a0052e3802a
等待一会去master节点验证。等待的是同步flannel网络
[root@master images]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 29m v1.15.0
node01 Ready 77s v1.15.0
node02 Ready 67s v1.15.0
确保所有pod都是running状态
[root@master images]# kubectl get pod --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-5c98db65d4-czt62 1/1 Running 0 29m
kube-system coredns-5c98db65d4-m2mkl 1/1 Running 0 29m
kube-system etcd-master 1/1 Running 0 29m
kube-system kube-apiserver-master 1/1 Running 0 29m
kube-system kube-controller-manager-master 1/1 Running 0 29m
kube-system kube-flannel-ds-8b5ww 1/1 Running 0 110s
kube-system kube-flannel-ds-l6vdf 1/1 Running 0 6m32s
kube-system kube-flannel-ds-lfp72 1/1 Running 0 2m1s
kube-system kube-proxy-nq96k 1/1 Running 0 2m1s
kube-system kube-proxy-t5vzx 1/1 Running 0 29m
kube-system kube-proxy-vz77h 1/1 Running 0 110s
kube-system kube-scheduler-master 1/1 Running 0 29m
设置kubectl命令行工具自动补全功能
[root@master ~]# yum install -y bash-completion
[root@master ~]# source /usr/share/bash-completion/bash_completion
[root@master ~]# source <(kubectl completion bash)
[root@master ~]# echo “source <(kubectl completionbash)” >> ~/.bashrc
为了以后我们写yaml文件方便些,这里设置tab键空格个数
[root@master ~]# vim .vimrc
set tabstop=2
[root@master ~]# source .vimrc

集群调试常用命令
如何安装指定版本kubenetes,这里注意,kubernetes的版本一致,主要体现在下载的各个组件的统一,那么这里注意组件是

如果几区那种初始化过程中,出现问题,即使问题解决之后,再次初始化集群之前,应该运行下边此命令

[root@master ~]# kubeadm reset Kube-proxy,kube-apiserver,kube-controller-manager,kube-scheduler

列出已经安装过的rpm包

yum list installed | grep kube

卸载安装的rpm包

yum remove kubeadm.x86_64 kubectl.x86_64 kubelet.x86_64 -y

安装指定的kubeadm

yum install -y kubelet-1.12.1 kubeadm-1.12.1 kubectl-1.12.1

到此k8s集群就部署完成了

k8s架构,基础概念

在这里插入图片描述

**kubectl**: k8s是命令行端,用来发送客户的操作指令。
**API server**:是k8s 集群的前端接口,各种客户端工具以及k8s的其他组件可以通过它管理k8s集群的各种资源。它提供了HTTP/HTTPS RESTful API,即K8S API.
**Scheduler**:负责决定将Pod放在哪个Node上运行。在调度时,会充分考虑集群的拓扑结构,当前各个节点的负载情况,以及应对高可用、性能、数据亲和性和需求。
**Controller Manager** :负责管理集群的各种资源,保证资源处于预期的状态。它由多种Controller 组成,包括Replication Controller、Endpoints Controller、Namespace Controller、ServiceaccountsController等等。
**Etcd**:负责保存k8s集群的配置信息和各种资源的状态信息。当数据发生变化时,etcd会快速的通知k8s相关组件。第三方组件,它有可替换方案。Consul、zookeeper
**Pod**:k8s集群的最小组成单位。一个Pod内,可以运行一个或多个容器。大多数情况下,一个Pod内只有一个Container容器。
**Flannel**:是k8s集群网路方案,可以保证Pod的跨主机通信。第三方解决方案,也有替换方案。Kubelet:它是Node的agent(代理),当Scheduler确定某个Node上运行Pod之后,会将Pod的具体配置信息发送给该节点的kubelet,kubelet会根据这些信息创建和运行容器,并向Master报告运行状态。
**kube-proxy**:负责将访问service的TCP/UDP数据流转发到后端的容器。如果有多个副本,kube-proxy会实现负载均衡。

运行一个栗子:
创建一个deployment资源对象。Pod控制器

kubectl run test-web --image=httpd --replicas=2

分析各个组件的作用以及架构工作流程:

1. kubectl发送部署请求到API server
2. APIserver通知Controller Manager 创建一个Deployment资源。
3. Scheduler执行调度任务,将两个副本Pod分发到node01和node02上。
4. node01和node02上的kubelet在各自节点上创建并运行Pod。
 **补充**:1.应用的配置和当前的状态信息保存在etcd中,执行kubectl  get pod  时API server 会从etcd中读取这些数据。
5. flannel会为每个Pod分配一个IP。但此时没有创建Service资源,目前kube-proxy还没有参与进来。

常见资源对象类型

**ReplicationController**: 用于确保每个Pod副本在任意时刻都能满足目标数量,简单点来说,它用于保证每个容器或容器组总是运行并且可以访问的:老一代无状态的Pod应用控制器。
**ReplicaSet**:   新一代的无状态的Pod应用控制器,它与RC的不同之处在于支持的标签选择器不同,RC只支持等值选择器,RS还额外支持基于集合的选择器。
**StatefulSet**:  用于管理有状态的持久化应用,如database服务程序,它与Deployment不同之处在于,它会为每一个Pod创建一个独有的持久性标识符,并确保每个Pod之间的顺序性。**DaemonSet**: 用于确保每一个节点都运行了某个Pod的一个副本,新增的节点一样会被添加此类**Pod**,在节点移除时,此类Pod会被回收。
**Job**: 用于管理运行完成后即可终止的应用,例如批量处理作业任务。
**Volume**: PV  PVC storageclass
**ConfigMap**:
**Secret**:
Role:
ClusterRole:
RoleBinding:
ClusterRoleBinding:
Service account
**Helm**:

猜你喜欢

转载自blog.csdn.net/hjyhjy0/article/details/109430981