k8s架构图

在这里插入图片描述

概念类:k8s的工作流程

1、比如说,创建一个pod,运维人员通过使用kubectl命令,向apiserver发出创建Pod请求,告诉它我想干什么,期望是什么。
2、API Server 响应请求后,并通过一系列认证授权,把请求存储到etcd,并通知控制器Controller-manager,它会通过API server读取etcd里的数据,然后按照预设的模板去创建Pod,并将pod数据写入etcd。
3、然后Controller-manager 会通过API Server去找Scheduler调度, 为新创建的Pod选择最适合的Node节点。Scheduler 会通过预算策略在所有Node节点中挑选最优的。
4、比如Node 节点中还剩多少资源,是通过汇报给API Server ,然后存储在etcd 里,API Server 会调用找到etcd 里所有Node节点的剩余资源,再去对比运维人员创建Pod 所需要的资源,会在所有Node 节点中查找哪些Node节点符合这个要求。如果都符合,预算策略就交给优选策略处理,优选策略再通过CPU的负载、内存的剩余量等因素选择最合适的Node 节点,并把Pod调度到这个Node节点上运行。
5、controller manager会通过API Server去通知kubelet去创建pod,然后通过kube-proxy中的service对外提供服务接口实现访问。

Kubernetes是什么?

Kubernetes是一个用于管理容器化应用和服务。能够进行应用的自动化部署和扩缩容。

1.自动装箱
基于容器对应用运行环境的资源配置要求自动部署应用容器

2.自我修复(自愈能力)

  • 当容器失败时,会对容器进行重启,当所部署的Node节点有问题时,会对容器进行重新部署和重新调度
  • 当容器未通过监控检查时,会关闭此容器,直到容器正常运行时,才会对外提供服务

3.水平扩展
通过简单的命令、用户UI界面或基于CPU等资源使用情况,对应用容器进行规模扩大或规模剪裁

4.服务发现
用户不需要使用额外的服务发现机制,就能够基于Kubernetes自身能力实现服务发现和负载均衡

5.滚动更新
可以根据应用的变化,对应用容器运行的应用,进行一次性或批量式更新

6.版本回退
可以根据应用部署情况,对应用容器运行的应用,进行历史版本即时回退

7.密钥和配置管理
在不需要重新构建镜像的情况下,可以部署和更新密钥和应用配置,类似热部署。

8.存储编排
自动实现存储系统挂载及应用,特别对有状态应用实现数据持久化非常重要存储系统可以来自于本地目录、网络存储(NFS、Gluster、Ceph、Cinder等)公共云存储服务等

kubernetes 集群部署

准备开始

一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux
发行版以及一些不提供包管理器的发行版提供通用的指令 每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响你应用的运行内存) 2
CPU 核或更多 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以) 节点之中不可以有重复的主机名、MAC 地址或
product_uuid。请参见这里了解更多详细信息。 开启机器上的某些端口。请参见这里 了解更多详细信息。 禁用交换分区。为了保证
kubelet 正常工作,你 必须 禁用交换分区。

版本: kubeadm-1.18.0 kubelet-1.18.0 kubectl-1.18.0

由于k8s更新频繁,这里指定版本
官方https://kubernetes.io/

192.168.0.13   k8s-master
192.168.0.8   k8s-node1
192.168.0.4   k8s-node2

1、设置三台机器的主机名

master上执行:

[root@localhost ~]# hostnamectl --static set-hostname k8s-master
[root@localhost ~]# bash

node1上执行:

[root@localhost ~]# hostnamectl --static set-hostname k8s-node1
[root@localhost ~]# bash

node2上执行:

[root@localhost ~]# hostnamectl --static set-hostname k8s-node2
[root@localhost ~]# bash

1.1设置hosts

在master机器上设置hosts,均执行如下命令:(ip为服务器内网ip)

echo '192.168.0.13   k8s-master
192.168.0.8   k8s-node1
192.168.0.4   k8s-node2' >> /etc/hosts

1.2关闭三台机器上的防火墙(三台)

systemctl disable firewalld.service
systemctl stop firewalld.service

1.3设置时间同步(三台)

yum -y install ntpdate
ntpdate time.windows.com

wget http://mirrors.aliyun.com/repo/Centos-7.repo    可选操作,阿里云yum源

复制

1.4关闭swap(三台)

swapoff -a  #临时关闭
vim /etc/fstab   #永久关闭 

#注释掉swap这行
(如果没有可以继续下一步)

/dev/mapper/centos‐swap swap swap defaults 0 0

systemctl reboot#重启生效

free ‐m #查看下swap交换区是否都为0,如果都为0则swap关闭成功
在这里插入图片描述

1.5关闭selinux(三台)

进入路径,etc/selinux/config,然后将SELINUX的值改为“disabled”

sed -i 's/enforcing/disabled/g' /etc/selinux/config  #永久关闭

在这里插入图片描述

1.6允许 iptables 检查桥接流量(三台)

确保 br_netfilter 模块被加载。这一操作可以通过运行 lsmod | grep br_netfilter 来完成。若要显式加载该模块,可执行 sudo modprobe br_netfilter。

为了让你的 Linux 节点上的 iptables 能够正确地查看桥接流量,你需要确保在你的 sysctl 配置中将 net.bridge.bridge-nf-call-iptables 设置为 1。如:


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    //生效

1.7所有节点安装docker

1.配置yum源(这里使用阿里云的源)

yum install wget -y 
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

2.安装docker

yum install docker-ce docker-ce-cli -y

如下,或者使用rpm包安装

  yum list docker-ce --showduplicates | sort -r
  yum -y install docker-ce-18.06.1.ce-3.el7
  systemctl enable docker && systemctl start docke
  systemctl status docke

3.编辑docker配置文件

 mkdir -p /etc/docker    创建路径
编辑/etc/docker/daemon.json   //配置阿里云镜像加速
exec-opts含义如下文

cat > /etc/docker/daemon.json << EOF
{
    "registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"],
    "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

4.启动docker服务

systemctl daemon-reload && systemctl enable docker && systemctl start docker

Docker 在默认情况下使用的 Cgroup Driver 为cgroupfs

而 Kubernetes 其实推荐使用systemd来代替cgroupfs

修改docker配置以适应kubelet (没有该文件就新建一个)

vi /etc/docker/daemon.json
{ 
    "registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"],
    "exec-opts": ["native.cgroupdriver=systemd"]       //添加这行
}
systemctl daemon-reload
systemctl restart docker

docker info | grep Cgroup*   #查看是否修改成功

1.8添加部署k8s的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
yum -y install  kubeadm-1.18.0 kubelet-1.18.0 kubectl-1.18.0
systemctl enable kubelet.service     //开机自启

1.9初始化master节点

kubeadm init \
--apiserver-advertise-address=192.168.0.13 \
--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

相关参数含义:

apiserver-advertise-address   表示当前节点的ip。对应的是192.168.0.13   k8s-master

image-repository              拉取镜像的仓库地址,这里使用的阿里云的加速镜像

kubernetes-version            当前的版本:这里是v1.18.0

service-cidr                  这个参数后的IP地址直接就套用10.96.0.0/12 ,以后安装时也套用即可,不要更改

pod-network-cidr              k8s内部的pod节点之间网络可以使用的IP段,不能和service-cidr写一样,
                              如果不知道怎么配,就先用这个10.244.0.0/16

在这里插入图片描述
返回Your Kubernetes control-plane has initialized successfully!成功
在这里插入图片描述
相关组件已经拉取到,初始化成功

2.0设置使用kubectl命令(三台)

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

2.1将node节点加入到集群中

在node节点执行,执行在kubeadmin init输出的kubeadmin join的命令
直接复制即可
在这里插入图片描述
默认的token有效期为24h,如果过期了需求重新生成,重新生成的token不影响已经加进集群的节点

 kubeadm token create --print-join-command

两台节点都加完后验证
在这里插入图片描述

2.2部署CNI网络插件

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml

执行后再确认,已经是ready状态了
在这里插入图片描述

这里有个问题点:
其他node节点上执行kubectl命令会报错
error: no configuration has been provided, try setting KUBERNETES_MASTER environment variable
在这里插入图片描述

这里需要设置一下环境变量
打开/etc/profile文件 在最后一行添加

export KUBECONFIG=/etc/kubernetes/kubelet.conf 

然后 source /etc/profile生效即可

2.3测试k8s集群

在k8s集群中创建一个pod,验证是否正常运行

 kubectl create deployment nginx --image=nginx
 拉取一个nginx镜像,需要等待一下,状态为runing即可
 
 kubectl expose deployment nginx --port=80 --type=NodePort
对外暴露端口,可以让其他节点访问得到,这里意思是其他节点内网访问哈
 [root@k8s-node1 ~]# kubectl get pod,svc
NAME                        READY   STATUS    RESTARTS   AGE
pod/nginx-f89759699-dmpfb   1/1     Running   0          24m

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        90m
service/nginx        NodePort    10.103.218.112   <none>        80:31849/TCP   11m


随机节点机器+端口31849访问测试,所有节点都能访问pod里的容器,证明网络已联通
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

这样一个k8s集群就已经完成了!!!

kubectl命令大全(后续更新中,)

1、kubectl概述

kubectl是kubenetes集群的命令行工具,通过kubectl能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署

2、kubectl的命令用法

kubectl  【command】 【type】 【NAME】 【flages】
1、command:指定要对资源执行的操作,例如:create get describe delete
2、TYPE:指定资源类型,资源类型是大小写敏感的,开发者能够以单数、复数和缩略的形式
3、NAME:指定资源的名称,名称也大小写敏感的,如果省略名称,会显示所以资源
4、flages:指定可选参数,例如-s 或者-server 指定k8s apiserver的地址和端口

1、kubectl --help
帮助命令,可以具体查看某个操作
例如: kubectl get --help

2、基础命令:
(1)create 通过文件名或标准输入创建资源
(2)expose 将一个资源公开为一个新的service
(3)run 在集群中运行一个特定的镜像
(4)set 在对象上设置特定的功能
(5)get 显示一个或多个资源
(6)explain 文档参考资料
(7)edit 使用默认的编辑器编辑一个资源
(8)delete 通过文件名、标准输入、资源名称或者标签选择器来删除资源

kubectl laber node 【节点名称】【node-role.kubernetes.io/】【填写需要打便签的名字】

 kubectl label node k8s-node2 node-role.kubernetes.io/worker=
 给node节点的k8s-node2主机打上标签,名字为worker

这里‘=等于号‘和‘-减号‘。标签需要写什么名字,就写xxxx=即可xxx代表需要取的标签名 -号则是删除标签
例如:删除k8s-node2主机标签worker

kubectl label node k8s-node2 node-role.kubernetes.io/worker-
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐