是Google开源的一个容器编排引擎,用于自动化容器化应用程序的部署、规划、扩展和管理,它将组成应用程序的容器分组为逻辑单元,以便管理与发现,用于管理云平台中多个主机上的容器化的应用
k8s的目标是让部署容器化的应用简单并且高效,很多细节都不需要去手工配置与处理
采用Go语言开发
Kubernetes管理员认证(CKA)
全球k8s管理员认证,考试只允许查阅官方文档
- https://kubernets.io/
- https://github.com
基本概念理解:https://blog.csdn.net/TM6zNf87MDG7Bo/article/details/79621510
控制器管理的Pod
- ReplicationController & ReplicaSet & Deployment
- ReplicationController用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的Pod来替代;而如果异常多出来的容器也会自动回收
- ReplicaSet与ReplicationController类似,且支持集合式的selector(新版本的k8s建议使用ReplicaSet)
- 虽然ReplicaSet可以独立使用,但一般还是建议使用Deployment来自动管理ReplicaSet。这样就无需担心与其他机制的不兼容问题(比如ReplicaSet不支持rolling-update滚动更新)
- HPA(horizontal Pod Autoscaling)仅适用于Deployment和ReplicaSet,在V1版本中仅支持根据pod的cpu利用率扩缩容,在vlapha版本中,支持根据内存和用户自定义的metric扩缩容
- StatefulSet:为了解决有状态服务的问题(对应Deployment和ReplicaSet是为无状态服务而设计)应用场景包括:
- 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
- 稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于headless service(即没有Cluster IP的Service)来实现
- 有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要根据定义的顺序依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod都必须是Running和Ready状态)
- 有序收缩,有序删除(即从N-1到0)
- DaemonSet:确保全部或一些node上运行一个pod的副本。当有node加入集群时,也会为其新增一个pod。当有node从集群移除时,这些pod也会回收。删除DaemonSet将胡i删除它创建的所有Pod。典型用法:
- 运行集群存储daemon,例如在每个node上运行glusterd、ceph
- 在每个node上运行日志收集daemon,例如fluentd、logstash
- 在每个Node上运行监控daemon,例如promethus node exporter
- Job:负责批处理任务,即仅执行依次的任务,它保证批处理任务的一个或多个Pod成功结束
- Cron Job管理基于时间的Job,即:
- 在给定时间点只运行一次
- 周期性地在给定时间点运行
k8s的网络模型假定了所有的pod都在一个可以直接连通的扁平的网络空间中,这在GCE里面是线程的网络模型,k8s假定这个网络已经存在。而在私有云里搭建k8s集群,就不能假定这个网络已经存在。需要自己实现这个网络假设,将不同节点上的docker容器之间的互相访问先打通,然后运行k8s
部署k8s环境(集群)主要有多种方式
(1)minikube:在本地运行k8s的工具,可以在个人计算机上运行一个单节点k8s集群,以便试用k8s或进行日常开发工作
在线工具:https://kubernetes.io/docs/tutorials/hello-minikube/
(2)kind:与minikube类似,可以在本地运行,但需要安装并配置Docker
https://kind.sigs.k8s.io/
(3)kubeadm:k8s部署工具,提供kubeadm init和kubeadm join两个操作命令,可以快速部署一个k8s集群
官方文档:
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
(4)二进制包:从GitHub下载发行版的二进制包,手动安装部署每个组件,组成kubernetes集群,步骤较为繁琐,但能加强对各个组件的认识
(5)yum安装:yum源里面的k8s版本较老,不推荐
(6)第三方工具或者直接购买类似阿里云这样的公有云平台k8s
Kubeadm部署kubernetes
kubeadm是官方社区推出的一个用于快速部署k8s集群的工具,这个工具能够通过两条指令完成一个k8s集群的部署
- 1、创建一个Master 节点
kubeadm init
- 2、将Node节点加入到Master集群中
kubeadm join <master节点的ip和端口>
k8s部署环境要求
- 一台或多台机器 centos7.x-86_x64
- 硬件:内存2G+,CPU 2核
- 集群间的各个机器之间能相互通信
- 集群内各个机器可以访问外网,需要拉取镜像
- 禁止swap分区
在staging搭建的两个服务器作为测试
master:192.168.14.97 10.10.15.189
node01:192.168.14.161 10.10.11.249
以下操作需要两台服务器都执行
#关闭防火墙(云服务器不用)
systemctl stop firewalld
systemctl disable firewald
#关闭selinux(好像云服务器不用此操作)
sed -i 's/enforcing/disabled' /etc/selinux/config #永久(永久操作需重启电脑)
setenforce 0 #临时
#关闭swap(k8s禁止虚拟内存以提高性能)
sed -ri 's/.*swap.*/#&/' /etc/fstab #永久
swapoff -a #临时
#修改主机名
hostnamectl set-hostname master
hostnamectl set-hostname node01
#在master中添加hosts(或者直接编辑该文件)
cat >> /etc/hosts << EOF
10.10.15.189 master
10.10.11.249 node01
EOF
#设置网桥参数
sysctl -w net.ipv4.ip_forward=1
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
#生效
sysctl -p /etc/sysctl.d/k8s.conf
#时间同步
yum install ntpdate -y
ntpdate time.windows.com
ntpdate -u 210.72.145.44
#输入date查看当前时间
所有服务器节点安装Docker、kubeadm、kubelet
(1)安装Docker
k8s默认容器运行环境是Docker,因此需要先安装Docker
设置Cgroup Driver安装完成后,需设置Docker的daemon.json,增加exec-opts
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://lwj5lfe1.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
sudo systemctl daemon-reload
sudo systemctl restart docker
(2)安装kubelet kubeadm 和kubectl(需要在所有服务器上执行)
kubelet:运行在cluster的所有节点上,负责启动POD和容器
kubeadm :用于初始化cluster
kubectl:是k8s的命令行工具,通过kubectl可以部署和管理应用,查看各种资源、创建、删除和更新组件
安装:https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.3e221b11Cg7Ixy
#添加k8s的阿里云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
#关闭selinux(之前执行过可不用)
setenforce 0
#安装kubelet kubeadm 和kubectl,可指定版本(当前默认是最新版本1.22.1-0)
yum install -y kubelet kubeadm kubectl
yum install kubelet-1.21.2 kubeadm-1.21.2 kubectl-1.21.2 -y
#设置开机自启
systemctl enable kubelet && systemctl start kubelet
#查看安装是否成功
yum list installed | grep kubelet
yum list installed | grep kubeadm
yum list installed | grep kubectl
#查看安装的版本
kubelet --version
Kubernetes v1.21.2
(3)拉取镜像
#1、使用kubeadm命令查看当前k8s所需镜像版本
kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.21.5
k8s.gcr.io/kube-controller-manager:v1.21.5
k8s.gcr.io/kube-scheduler:v1.21.5
k8s.gcr.io/kube-proxy:v1.21.5
k8s.gcr.io/pause:3.4.1
k8s.gcr.io/etcd:3.4.13-0
k8s.gcr.io/coredns/coredns:v1.8.0
#2、编写脚本
vi images.sh
#!/bin/bash
url=registry.cn-hangzhou.aliyuncs.com/google_containers
# 安装指定的kubectl版本
version=v1.21.2
# 上面查出来的coredns版本号
coredns=1.8.0
images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`)
for imagename in ${images[@]} ; do
if [ $imagename = "coredns" ]
then
docker pull $url/coredns:$coredns
docker tag $url/coredns:$coredns k8s.gcr.io/coredns/coredns:v1.8.0
docker rmi -f $url/coredns:$coredns
else
docker pull $url/$imagename
docker tag $url/$imagename k8s.gcr.io/$imagename
docker rmi -f $url/$imagename
fi
done
#3、修改images.sh脚本权限,改为可执行权限。
chmod +x images.sh
#4、执行脚本,拉取镜像
./images.sh
#查看镜像 docker images
(4)初始化k8s集群
该命令只需在master节点上执行
#初始化k8s集群(该命令只需在master节点上执行)
kubeadm init --kubernetes-version=1.21.2 --apiserver-advertise-address=10.10.16.38 --pod-network-cidr=10.244.0.0/16
--kubernetes-version # 指定的版本
--apiserver-advertise-address # K8S主节点的地址
--pod-network-cidr # pod的网络IP范围
#如果遇到unexpected kernel config: CONFIG_CGROUP_PIDS
# [ERROR SystemVerification]: missing required cgroups: pids
#需要升级内核,重置
kubeadm reset
#cat /boot/config-uname | grep CGROUP在这个文件里面加 CONFIG_CGROUP_PIDS=y,如:
#内核升级参考
https://blog.csdn.net/wulinpingailxr/article/details/96480526
初始化成功后会生成以下命令
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 10.10.15.189:6443 --token yourtoken \
--discovery-token-ca-cert-hash sha256:hashvalue
执行k8s集群初始化生成的创建目录和复制配置文件命令。
#在master节点上执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#在node节点上得根目录下/,执行生成得加入k8s集群命令
kubeadm join 10.10.16.38:6443 --token yourtoken \
--discovery-token-ca-cert-hash sha256:hashvalue
#在master节点上查看k8s集群节点
kubectl get nodes
安装Calico网络插件
#使用curl下周插件得yaml文件
curl https://docs.projectcalico.org/manifests/calico.yaml -O
#使用kubectl apply应用刚刚下载好的calico.yaml文件。
kubectl apply -f calico.yaml
#查看当前k8s集群得pods
kubectl get pods -o wide -n kube-system
kube-flannel
#下载yaml文件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
#使用kubectl apply应用刚刚下载好的calico.yaml文件。
kubectl apply -f kube-flannel.yml
#查看当前k8s集群的pods(一个pod内运行了多个docker容器,-n表命名空间)
kubectl get pods -o wide -n kube-system
kubectl get pods -n kube-system
此时查看集群节点状态:
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 141m v1.21.2
node01 Ready <none> 124m v1.21.2
到此为止环境搭建完成
#创建命名空间
kubectl create namespace karen
#查看命名空间
kubectl get namespace
- 就是将一个程序放在docker里部署,这个docker应用就是容器化应用
- 如在docker里面部署一个nginx,这个dockers+nginx一起就是一个容器化应用
- 步骤:
- 程序打包 —> 通过dockerfile文件生成docker镜像 —> k8s部署该镜像 —> 部署完成
- 制作镜像 —> 通过控制管理pod —> 暴露应用以便外界访问
#拉取镜像运行(运行成功后可到node节点查看到拉取的nginx镜像)
kubectl create deployment nginx01 --image=nginx
kubectl get pod #查看pod
kubectl get deployment #查看控制器
kubectl get service #查看服务
#暴露端口,访问地址:http://NodeIp:Port
kubectl expose deployment nginx01 --port=80 --type=NodePort
#访问地址。30154为查看服务里查询到的端口地址
http://192.168.14.161:30154/
#后续操作(删除)
kubectl delete deployment nginx01 #删除控制器(删除后,控制器下对应的pod也会被删除)
kubectl delete pod nginx01-67fdf8d7c7-gllff #查询对应pod名进行删除