我是根据《Kubernetes in Action》这本书来学习Kubernetes的。只能算是自己的笔记。不能作为学习的参考
随着系统可部署组建的数量增长,把它们都管理起来会变得越辣越困难。因此需要一个更好的方式来部署和管理这些组件,并支持基础设施的全球性伸缩。
谷歌于2014年,开放了Kubernetes,一个基于Borg、Omege及其他谷歌内部系统实践的开源系统
kubernetes,简称K8s,是用8 代替8 个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes 提供了应用部署,规划,更新,维护的一种机制。
传统的应用部署方式是通过插件或脚本来安装应用。这样做的缺点是应用的运行、配置、管理、所有生存周期将与当前操作系统绑定,这样做并不利于应用的升级更新/回滚等操作,当然也可以通过创建虚拟机的方式来实现某些功能,但是虚拟机非常重,并不利于可移植性。
新的方式是通过部署容器方式实现,每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源。相对于虚拟机,容器能快速部署,由于容器与底层设施、机器文件系统解耦的。
简化应用程序部署
更好地利用硬件
健康检查和自修复
当容器失败时,会对容器进行重启
当所部署的Node节点有问题时,会对容器进行重新部署和重新调度
当容器未通过监控检查时,会关闭此容器直到容器正常运行时,才会对外提供服务
如果某个服务器上的应用不响应了,Kubernetes会自动在其它的地方创建一个
自动扩容
服务发现
滚动更新
版本回退
密钥和配置管理
存储编排
自动实现存储系统挂载及应用,特别对有状态应用实现数据持久化非常重要
存储系统可以来自于本地目录、网络存储(NFS、Gluster、Ceph 等)、公共云存储服务
多处理
K8S架构主要包含两部分:Master(主控节点)和 Node(工作节点)
k8s 集群控制节点,对集群进行调度管理,接受集群外用户去集群操作请求;
Master:主控节点
Work Node:工作节点
容器运行环境【Container Runtime】
fluentd:是一个守护进程,它有助于提升集群层面日志
Pod
Volume
Controller
Deployment
Service
Label
Namespace
命名空间,逻辑隔离
API
我们通过Kubernetes的API来操作整个集群
同时我们可以通过 kubectl 、ui、curl 最终发送 http + json/yaml 方式的请求给API Server,然后控制整个K8S集群,K8S中所有的资源对象都可以采用 yaml 或 json 格式的文件定义或描述
一些解释
在开始之前,部署Kubernetes集群机器需要满足以下几个条件:
服务器角色 | ip |
---|---|
k8s master | 192.168.188.88 |
k8s node1 | 192.168.188.89 |
k8s node2 | 192.168.188.90 |
开始在每台机器上执行下面的命令
因为我是购买阿里云服务器来进行实验 因此只需配置安全组
关闭防火墙
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
# 根据规划设置主机名【master节点上操作】
hostnamectl set-hostname master
# 根据规划设置主机名【node1节点操作】
hostnamectl set-hostname node1
# 根据规划设置主机名【node2节点操作】
hostnamectl set-hostname node2
添加ip到hosts
cat >> /etc/hosts << EOF
192.168.188.88 master
192.168.188.89 node1
192.168.188.90 node2
EOF
验证
[root@master ~]# cat /etc/hosts
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.188.88 kubernetes kubernetes
192.168.188.88 master
192.168.188.89 node1
192.168.188.90 node2
将桥接的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
所有节点安装Docker、kubeadm、kubelet,Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker
首先配置一下Docker的阿里yum源
安装需要的安装包
yum install -y yum-utils
设置镜像仓库
我们用阿里云
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新yum软件包索引
yum makecache fast
安装docker docker-ce 社区
yum -y install docker-ce
查看版本
docker version
设置开机启动
systemctl enable docker --now
配置docker的镜像源
mkdir -p /etc/docker
这个是我自己阿里云的加速 每个人都不一样 可以去阿里云官方查看
tee /etc/docker/daemon.json <<-EOF
{
"registry-mirrors": ["https://m0rsqupc.mirror.aliyuncs.com"]
}
EOF
验证
[root@master ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://m0rsqupc.mirror.aliyuncs.com"]
}
然后重启docker
systemctl restart docker
添加kubernetes软件源
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
安装kubelet、kubeadm、kubectl,同时指定版本
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
systemctl enable kubelet --now
在 192.168.188.88 执行,也就是master节点
kubeadm init --apiserver-advertise-address=192.168.188.88 --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
由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址,(执行上述命令会比较慢,因为后台其实已经在拉取镜像了)
我们 docker images 命令即可查看已经拉取的镜像
表示kubernetes的镜像已经安装成功
下面红色圈出来的部分 是下面加入从节点需要使用的命令
使用kubectl工具
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
查看运行的节点
kubectl get nodes
[root@master .kube]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady master 8m4s v1.18.0
目前有一个master节点已经运行了,但是还处于未准备状态
需要到 node1 和 node2服务器,向集群添加新节点
执行在kubeadm init输出的kubeadm join命令
以下的命令是在master初始化完成后,每个人的都不一样!!!需要复制自己生成的
kubeadm join 192.168.188.88:6443 --token klosch.hwdnms0hh3l0gky5 \
--discovery-token-ca-cert-hash sha256:d691cf804ca0bee62a9b319999435ce52d2ef1cf134da13a3a7c9a618bbb1788
如果找不到这串命令
可用手动生成
kubeadm token create --print-join-command
当我们把两个节点都加入进来后,我们就可以去Master节点 查看
kubectl get node
[root@master .kube]# kubectl get node
NAME STATUS ROLES AGE VERSION
master NotReady master 14m v1.18.0
node1 NotReady <none> 64s v1.18.0
node2 NotReady <none> 61s v1.18.0
发现从节点已经加入,但状态仍然是没准备好
上面的状态还是NotReady,下面我们需要网络插件,来进行联网访问
flannel网络的官方github地址为 链接
在官方文档中有对使用那个flannel的配置有说明,所以我们按照如下指示来安装flannel网络插件
下载kube-flannel.yml
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
拉取flannel镜像到本地
由于我们无法直接下载官方提供的镜像,所以我们去阿里云的镜像服务中使用其他用户转存的flannel镜像,在这里我就使用了阿里云用户公开镜像中的 k8sos/flannel 这个镜像,由于kube-flannel.yml中使用的镜像是 v0.13.1-rc2 版本,所以我们也从阿里云上下载了 k8sos/flannel:v0.13.1-rc2版本
阿里云镜像服务地址: 阿里云镜像 选择镜像搜索,输入关键字“k8sos/flannel” 进行搜索,即可搜索到。
然后使用docker pull 将镜像拉取下来
# 在我写这篇文章时该镜像的公网地址如下,如果你在使用时无法通过该公网地址拉取镜像,请去阿里云获取最新镜像地址
docker pull registry.cn-hangzhou.aliyuncs.com/k8sos/flannel:v0.13.1-rc2
修改kube-flannel.yml
镜像拉取本地后,修改kube-flannel.yml将里面使用的官方镜像的名字改为自己拉取的镜像名称
# 查看镜像拉取到本地后的名称
docker images | grep flannel
# 输出
# registry.cn-hangzhou.aliyuncs.com/k8sos/flannel v0.13.1-rc2 dee1cac4dd20 3 weeks ago 64.3MB
从上面输出可以看出该镜像在我本地服务器的名称为 registry.cn-hangzhou.aliyuncs.com/k8sos/flannel
修改 kube-flannel.yml 将其中的 “image: quay.io/coreos/flannel:v0.13.1-rc2” 修改为 “image: registry.cn-hangzhou.aliyuncs.com/k8sos/flannel:v0.13.1-rc2”
应用flannel网络
使用 kubectl apply
命令应用网络
# -f 后面指定kube-flannel.yml的文件路径
kubectl apply -f ./kube-flannel.yml
在应用网络之后,我们就可以查看一下,flannel 的pod是否启动成功,在我的服务器上执行如下命令效果如下,代码flannel已经应用成功
kubectl get pod -n kube-system | grep flannel
[root@master ~]# kubectl get pod -n kube-system | grep flannel
kube-flannel-ds-2fjc2 1/1 Running 0 16m
kube-flannel-ds-b6l9f 1/1 Running 0 16m
kube-flannel-ds-znj8f 1/1 Running 0 16m
查看所有节点
kubectl get nodes
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 38m v1.18.0
node1 Ready <none> 25m v1.18.0
node2 Ready <none> 25m v1.18.0
所有状态已经是Ready了
如果上述操作完成后,还存在某个节点处于NotReady状态,可以在Master将该节点删除
master节点将该节点删除
kubectl drain node1 --delete-local-data --force --ignore-daemonsets
kubectl delete node node1
# 然后到k8snode1节点进行重置
kubeadm reset
# 重置完后在加入
kubeadm join 192.168.188.88:6443 --token klosch.hwdnms0hh3l0gky5 \
--discovery-token-ca-cert-hash sha256:d691cf804ca0bee62a9b319999435ce52d2ef1cf134da13a3a7c9a618bbb1788
我们都知道K8S是容器化技术,它可以联网去下载镜像,用容器的方式进行启动
在Kubernetes集群中创建一个pod,验证是否正常运行:
下载nginx 会联网拉取nginx镜像
kubectl create deployment nginx --image=nginx
查看状态
kubectl get pod
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-f89759699-brsx7 0/1 ContainerCreating 0 8s
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-f89759699-brsx7 1/1 Running 0 47s
pod状态显示Running 说明成功运行
下面我们就需要将端口暴露出去,让其它外界能够访问
暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
查看一下对外的端口
kubectl get pod,svc
[root@master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed
[root@master ~]# kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/nginx-f89759699-brsx7 1/1 Running 0 118s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 44m
service/nginx NodePort 10.100.38.185 <none> 80:30844/TCP 5s
能够看到,我们已经成功暴露了 80端口 到 30844上
在阿里云安全组上打开30844端口
通过浏览器访问主节点ip+端口
访问两个从节点+端口
拉取作者写的kubia镜像
kubectl run kubia --image=luksa/kubia --port=8080
创建一个外部的负载均衡,可用通过负载均衡的公共IP访问pod
kubectl expose pod kubia --type=LoadBalancer
扩容 三个副本
kubectl scale deploy kubia-deployment --replicas 3
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 105m
kubia-http LoadBalancer 10.104.90.190 <pending> 8080:32580/TCP 2m26s
nginx NodePort 10.100.38.185 <none> 80:30844/TCP 61m
实现负载均衡
[root@master ~]# curl 10.104.90.190:8080
You've hit kubia-6c68d68756-zx455
[root@master ~]# curl 10.104.90.190:8080
You've hit kubia-6c68d68756-bnsjp
[root@master ~]# curl 10.104.90.190:8080
You've hit kubia-6c68d68756-zx455
[root@master ~]# curl 10.104.90.190:8080
You've hit kubia-6c68d68756-bnsjp
[root@master ~]# curl 10.104.90.190:8080
You've hit kubia-6c68d68756-l5l5s