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是一个用于管理容器化应用和服务。能够进行应用的自动化部署和扩缩容。
1.自动装箱
基于容器对应用运行环境的资源配置要求自动部署应用容器
2.自我修复(自愈能力)
3.水平扩展
通过简单的命令、用户UI界面或基于CPU等资源使用情况,对应用容器进行规模扩大或规模剪裁
4.服务发现
用户不需要使用额外的服务发现机制,就能够基于Kubernetes自身能力实现服务发现和负载均衡
5.滚动更新
可以根据应用的变化,对应用容器运行的应用,进行一次性或批量式更新
6.版本回退
可以根据应用部署情况,对应用容器运行的应用,进行历史版本即时回退
7.密钥和配置管理
在不需要重新构建镜像的情况下,可以部署和更新密钥和应用配置,类似热部署。
8.存储编排
自动实现存储系统挂载及应用,特别对有状态应用实现数据持久化非常重要存储系统可以来自于本地目录、网络存储(NFS、Gluster、Ceph、Cinder等)公共云存储服务等
准备开始
一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux
发行版以及一些不提供包管理器的发行版提供通用的指令 每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响你应用的运行内存) 2
CPU 核或更多 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以) 节点之中不可以有重复的主机名、MAC 地址或
product_uuid。请参见这里了解更多详细信息。 开启机器上的某些端口。请参见这里 了解更多详细信息。 禁用交换分区。为了保证
kubelet 正常工作,你 必须 禁用交换分区。
由于k8s更新频繁,这里指定版本
官方https://kubernetes.io/
192.168.0.13 k8s-master
192.168.0.8 k8s-node1
192.168.0.4 k8s-node2
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
在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
systemctl disable firewalld.service
systemctl stop firewalld.service
yum -y install ntpdate
ntpdate time.windows.com
wget http://mirrors.aliyun.com/repo/Centos-7.repo 可选操作,阿里云yum源
复制
swapoff -a #临时关闭
vim /etc/fstab #永久关闭
#注释掉swap这行
(如果没有可以继续下一步)
/dev/mapper/centos‐swap swap swap defaults 0 0
systemctl reboot#重启生效
free ‐m #查看下swap交换区是否都为0,如果都为0则swap关闭成功
进入路径,etc/selinux/config,然后将SELINUX的值改为“disabled”
sed -i 's/enforcing/disabled/g' /etc/selinux/config #永久关闭
确保 br_netfilter 模块被加载。这一操作可以通过运行 lsmod | grep br_netfilter 来完成。若要显式加载该模块,可执行 sudo modprobe br_netfilter。
为了让你的 Linux 节点上的 iptables 能够正确地查看桥接流量,你需要确保在你的 sysctl 配置中将 net.bridge.bridge-nf-call-iptables 设置为 1。如:
cat <| 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.配置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* #查看是否修改成功
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 //开机自启
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!成功
相关组件已经拉取到,初始化成功
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
在node节点执行,执行在kubeadmin init输出的kubeadmin join的命令
直接复制即可
默认的token有效期为24h,如果过期了需求重新生成,重新生成的token不影响已经加进集群的节点
kubeadm token create --print-join-command
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml
这里有个问题点:
其他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生效即可
在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是kubenetes集群的命令行工具,通过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-