Kubernetes-01
Kubernetes
摘要:
-
需要掌握前置知识:linux操作系统、Docker
-
k8s概念和架构
-
从零基础搭建k8s集群
-
基于客户端工具kubeadm
-
基于二进制包方式安装
-
-
k8s核心概念
-
pod、Controller、Service、Ingress
-
RABC、 Helm、持久存储等。
-
-
搭建集群监控平台系统
-
从零开始搭建高可用k8s集群
-
在集群环境中部署项目
概念和架构
k8s的概述和特性
-
k8s是谷歌在214年开源的容器化集群管理系统
-
使用k8s进行容器应用管理
-
使用k8s利于应用管理
-
k8s目标是让部署容器化应用更加简洁和高效
官网介绍:https://baike.baidu.com/item/kubernetes/22864162?fr=aladdin
特性(功能):
-
自动装箱
基于容器对应用运行环境的资源配置要求自动部署应用容器。
-
自我修复(自愈能力)
当容器失败时,会对容器进行重启
当所部署的Node节点有问题时,会对容器进行重新部署和重新调度。
当容器未通过监控检查时,会关闭此容器直到容器正常运行时,才会对外提供服务。
-
水平扩展
通过简单的命令,对应用容器进行规模扩大和规模剪裁。高峰期副本自动增加等
-
服务发现(负载均衡)
对外提供统一的入口,节点调度,负载均衡
-
滚动更新
可以根据应用变化,对应用容器进行的应用,进行一次或批量更新。
-
版本回退
根据应用部署情况,对应用容器运行的应用,进行历史版本及时回退。
-
密码和配置管理
在不需要重新构建镜像的情况下,可以部署和更新秘钥和应用配置,类似于热部署。
-
存储编排
自动实现存储系统挂载及应用,特别对有状态应用实现数据持久化非常重要,存储系统可以来自于本地目录,网络存储(NFS、Gluster、Ceph等)、公共云存储服务。
-
批处理
提供一次性任务,定时任务;满足批量数据处理和分析的场景。
k8s架构组件
Master(主控节点)和node(工作节点)
-
Master组件:
-
API server:集群统一入口,以restful方式,交给etcd存储
-
scheduler:节点调度、选择node节点应用部署
-
controller-manager:处理集群中常规后台任务,一个资源对应一个控制器
-
etcd:存储系统,用于保存集群相关的数据
-
-
Node组件
-
kubelet:master派到node节点的代表,管理本机容器
-
kube-proxy:提供网络代理,负载均衡等操作
-
k8s核心概念
-
pod:
-
最小部署单元
-
一组容器的集合
-
一个pod中的容器是共享网络的
-
生命周期是短暂的
-
-
controller:(创建pod)
-
确保预期的pod副本数量
-
无状态应用部署
-
有状态应用部署
-
确保所有的node运行同一个pod
-
一次性任务、定时任务
-
-
Service:(入口)
-
定义一组pod的访问规则
-
搭建k8s
搭建k8s环境平台规划
-
单master集群
-
多master集群
服务器硬件配置要求
-
测试环境:
-
master:cpu两核 4G 20G
-
node:4核 8G 40G
-
-
生产环境:
-
更高硬件要求
-
搭建k8s集群部署方式
-
kubeadm:
-
Kubeadm是一个K8s部署工具,提供kubeadm init 和kubeadm join,用于快速部署Kubernetes集群。
-
kubeadm降低部署门槛,但屏蔽很多细节,遇到问题很难排查。
-
官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/
-
-
二进制包:(推荐)
-
从GitHub下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。
-
虽然手动部署麻烦点。期间可以学习很多工作原理,利于后期维护。
-
kubeadm方式搭建
Kubeadm是官方社区推出的一个用于快速部署Kubernetes集群的工具,这个工具能通过两条指令完成一个Kubernetes集群的部署:
-
创建一个Master节点 Kubeadm init
-
将node节点加入到当前集群中 $ kubeadm join < Master 节点的IP和端口>
官网安装地址:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
准备工作:
-
一台或多台机器,操作系统:Centos7.x-86_x64
-
硬件配置:2G或更多,2核+,30G+
-
集群中所以机器可以ping通
-
可访问外网,拉取镜像
-
禁止swap分区
三台服务器进行初始化配置:
#关闭防火墙(三台)
[root@Docker-01 ~]# systemctl stop firewalld && systemctl disable firewalld
[root@Docker-01 ~]# setenforce 0
sed -i 's/enforcing/disabled/g' /etc/selinux/config #永久关闭
#关闭swap(三台)
swapoff -a # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
#配置主机名
[root@Docker-01 ~]# hostnamectl set-hostname k8smaster
[root@Docker-02 ~]# hostnamectl set-hostname k8snode1
[root@Docker-03 ~]# hostnamectl set-hostname k8snode2
#在master添加hosts
[root@k8smaster ~]# cat >> /etc/hosts << EOF
192.168.1.7 k8smaster
192.168.1.8 k8snode1
192.168.1.9 k8snode2
EOF
#将桥接的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 -y install ntpdate
ntpdate time.windows.com
初始化完成。
-
所有节点安装Docker/kubeadm/kubelet
kubernetes默认CRI(容器运行时)为docker,因此先安装Docker。
-
安装docker
yum install -y wget && wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce-18.06.1.ce-3.el7 #版本太新可能会不兼容
systemctl enable docker && systemctl start docker
docker --version#配置阿里云镜像仓库
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
#或者:
"registry-mirrors":["https://alzgoonw.mirror.aliyuncs.com"]
-
-
添加阿里云yum软件源
[root@k8smaster yum.repos.d]# 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 -
安装kubeadm,kubelet和kubectl
[root@k8snode2 yum.repos.d]# yum install -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0
[root@k8snode2 yum.repos.d]# systemctl enable kubelet -
部署Kubernetes Master
#在master节点执行
[root@k8smaster ~]# kubeadm init \
--apiserver-advertise-address=192.168.1.7 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.15.0 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16
#初始化成功显示:
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
kubeadm join 192.168.1.99:6443 --token gasyov.co3ca4g3priwa8wr \
--discovery-token-ca-cert-hash sha256:dcce1ca3a1c38a3d153a1eb1994489a4550ead5676e0a7306e4544df264cc5ec
#查看到 拉取很多镜像
[root@k8smaster ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.aliyuncs.com/google_containers/etcd 3.4.13-0 0369cf4303ff 3 weeks ago 253MB
registry.aliyuncs.com/google_containers/kube-proxy v1.19.0 bc9c328f379c 3 weeks ago 118MB
registry.aliyuncs.com/google_containers/kube-apiserver v1.19.0 1b74e93ece2f 3 weeks ago 119MB
registry.aliyuncs.com/google_containers/kube-controller-manager v1.19.0 09d665d529d0 3 weeks ago 111MB
registry.aliyuncs.com/google_containers/kube-scheduler v1.19.0 cbdc8369d8b1 3 weeks ago 45.7MB
registry.aliyuncs.com/google_containers/coredns 1.7.0 bfe3a36ebd25 3 months ago 45.2MB
registry.aliyuncs.com/google_containers/pause 3.2 80d28bedfe5d 7 months ago 683kB根据提示执行以下操作:
[root@k8smaster ~]# mkdir -p $HOME/.kube
[root@k8smaster ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8smaster ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config -
加入Kubernetes Node
#查看集群
[root@k8smaster ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8smaster NotReady master 10m v1.19.2
#node加入集群(在node节点上执行)
kubeadm join 192.168.1.7:6443 --token gasyov.co3ca4g3priwa8wr \
--discovery-token-ca-cert-hash sha256:dcce1ca3a1c38a3d153a1eb1994489a4550ead5676e0a7306e4544df264cc5ec
#默认token有效期为24小时,过期后,就需要重新创建token:
kubeadm token create --print-join-command
#查看集群
[root@k8smaster ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8smaster NotReady master 12m v1.19.2
k8snode1 NotReady <none> 30s v1.19.2
k8snode2cat NotReady <none> 4s v1.19.2 -
部署CNI网络插件:
要让 Kubernetes Cluster 能够工作,必须安装 Pod 网络,否则 Pod 之间无法通信。
wget https://raw.githubsercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
默认镜像地址无法访问,sed命令修改为docker hub镜像仓库。
#执行如下命令部署 flannel:
[root@k8smaster k8s]# kubectl apply -f https://raw.githubsercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
#部署完成后,可以通过 kubectl get 重新检查 Pod 的状态:
[root@k8smaster k8s]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-bccdc95cf-7pm5h 1/1 Running 0 8m9s
coredns-bccdc95cf-xhx7j 1/1 Running 0 8m9s
etcd-k8smaster 1/1 Running 0 7m37s
kube-apiserver-k8smaster 1/1 Running 0 7m27s
kube-controller-manager-k8smaster 1/1 Running 0 7m31s
kube-flannel-ds-amd64-nq58v 1/1 Running 0 4m46s
kube-flannel-ds-amd64-wmzw2 1/1 Running 0 4m46s
kube-flannel-ds-amd64-zmr86 1/1 Running 0 4m46s
kube-proxy-8xc47 1/1 Running 0 8m9s
kube-proxy-9xd9b 1/1 Running 0 5m59s
kube-proxy-fhpb9 1/1 Running 0 6m51s
kube-scheduler-k8smaster 1/1 Running 0 7m21s
[root@k8smaster k8s]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8smaster Ready master 23m v1.15.0
k8snode1 Ready <none> 21m v1.15.0
k8snode2 Ready <none> 20m v1.15.0 -
测试Kubernetes集群
在Kubernetes集群中创建一个pod,验证是否正常运行:
#创建一个nginx镜像服务(pod)
[root@k8smaster ~]# kubectl create deployment nginx --image=nginx
deployment.apps/nginx created
#配置端口
[root@k8smaster ~]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed
#查看端口信息
[root@k8smaster ~]# kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/nginx-554b9c67f9-c2gdm 1/1 Running 0 5m28s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 35m
service/nginx NodePort 10.1.94.131 <none> 80:31383/TCP 3m33s
#访问测试成功;
ip:31383
#拓展:扩容三个nginx副本
kubectl scale deployment nginx --replicas=3