系统运维k8s

Kubernetes(K8S)入门与安装配置

2019-12-22  本文已影响0人  远古程序猿

什么是K8S

Kubernetes 是一个跨主机集群的开源的容器调度平台,它可以自动化应用容器的部署、扩展和操作 , 提供以容器为中心的基础架构。谷歌旗下开源软件,江湖人称K8S。

K8S能做什么

K8S的几个关键概念

k8s架构图

上图是一个通过K8S搭建的集群环境,采用三台物理机搭建(三台机器是K8S搭建集群的最低要求),我先简单介绍一下几个重点名词。

  1. Kubernetes Master 是K8S的主服务器,容器的部署、发布、复制都是通过它发起的命令,一般是部署在单独的物理机上。同时所有外界的数据包也都是先经过Kubernetes Master,由它来进行分配。

  2. Node 是集群的节点,它可以是一个独立的物理机,也可以是一个虚拟机,在每个节点中都有一个以上的pod。Node里面的功能都是通过docker、kubelet、kube-proxy这三个应用程序实现。

    • docker,K8S容器编排技术就是dokcer容器实现的,必备组件。
    • kubelet是用来处理master 下发的任务, 管理pod 中的容器, 注册自身所在的节点,以系统服务的方式呈现。
    • kube-proxy用于实现K8S跨主机跨容器的网路通信,之前我们提到的Pod与Pod之间、容器与容器之间(Pause)的通信都是通过它来实现。
  1. pod是K8S独有的概念,也是最基础最重要的概念。 中文释义有豆荚,豌豆的意思。它是K8S里面最小的控制单元,相比docker中容器是最小的控制单元,他们之间又有什么联系与区别呢?
    • Pod是“容器”的容器,可以包含多个”Container”,这就是与docker容器的区别,Pod就像一个豌豆荚包含了多个豆子,他包含了多个容器

    • Pod是K8S最小可部署单元,一个Pod就是一个进程,拥有自己独立的资源

    • Pod都是部署完整的应用或模块,一般情况下一个Pod中应该是一整套完整的服务,或者一整套功能性的模块

    • Pod内部容器网络互通的(通过Pause实现),每个Pod都有独立虚拟IP,Pod与Pod之间的通信通过Service服务实现,所有的通信底层都是基于kube-proxy的。

      1. Pause是Pod的组成部分之一,Pause的一个作用是让同一个Pod的容器间可以直接使用localhost加端口号的形式互相访问
      2. Pause还提供同一个Pod内所有容器的公共数据卷挂载功能
pod内部组成图
  1. Label 标签可以理解为每一个Pod的别名
  2. Replication Controller 复制控制器的职责是对Pod数量进行监控,例如我们命令中需要三个Pod,但是现在只有两个,那么Replication Controller会自动创建一个新的Pod,当它发现某个Pod没有响应时,Replication Controller会自动剔除这个Pod,如果有必要会创建新的Pod。它让我们可以通过一个参数直接修改Pod的数量。

K8S安装教程

环境准备

Centos 7 Master * 1 (注意必须是双核以上的CPU,否则无法初始化K8S)

Centos 7 Node * 2

  1. 设置主机名与时区
timedatectl set-timezone Asia/Shanghai 
hostnamectl set-hostname master   #131执行
hostnamectl set-hostname node1    #132执行
hostnamectl set-hostname node2    #133执行
  1. 为了便于区分,三台机器均配置以下hosts
vim  /etc/hosts
192.168.220.131 master
192.168.220.132 node1
192.168.220.133 node2
  1. 关闭Linux自带的安全增强模块,设置临时生效,并且关闭防火墙
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
systemctl disable firewalld
systemctl stop firewalld

K8S安装前置环境配置(三台机器都要执行)

  1. 将镜像包上传至服务器每个节点,里面包含了K8S、docker、以及各类配置文件,后面会有概述各个文件的作用。
mkdir /usr/local/k8s-install
cd /usr/local/k8s-install

将文件上传至该目录
网盘地址:https://pan.baidu.com/s/1NiAdf0Gp24qjVx2v_HqqyQ
提取码:aew7

  1. 每个Centos上安装Docker,注意不要使用19.0以上的docker版本,目前最新的1.15版本K8S也暂时不支持19.0的版本
cd /usr/local/k8s-install/kubernetes-1.14
tar -zxvf docker-ce-18.09.tar.gz
cd docker 
yum localinstall -y *.rpm   #加载当前目录下的所有rpm文件自动完成安装
systemctl start docker
systemctl enable docker
  1. 确保cgroup driver都是 groupfs

执行以下命令

docker info | grep cgroup 

如果不是groupfs,执行下列语句

cat << EOF > /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=cgroupfs"]
}
EOF
systemctl daemon-reload && systemctl restart docker\
  1. 安装kubeadm,kubeadm是集群部署管理工具,可用来安装K8S的一个工具,极大简化安装流程
cd /usr/local/k8s-install/kubernetes-1.14
tar -zxvf kube114-rpm.tar.gz
cd kube114-rpm
yum localinstall -y *.rpm
  1. 关闭交换区,Linux的交换区类似windows系统中虚拟内存,不太建议使用这个选项,关闭掉
swapoff -a
vi /etc/fstab 

将最后一行注释

image.png
  1. 配置网桥,iptables是Linux的一个网络规则,对我们的包按规则进行过滤。该配置让K8S容器间通过网桥通讯的时候也要遵循iptables的规则,提高网络传输安全性
cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
  1. 加载k8s的docker镜像
cd /usr/local/k8s-install/kubernetes-1.14

docker load -i k8s-114-images.tar.gz  #加载K8S镜像
docker load -i flannel-dashboard.tar.gz  #集群可视化管理组件

运行docker images可以看到以下几个关键应用

image.png

kube-proxy 容器间通讯代理、kube-apiserver API服务端、kube-scheduler 任务调度器、kube-controller-manager 集群控制器、coredns K8S内置的 DNS 服务器、etcd 用于保存集群所有的网络配置和对象的状态信息、pause前面已经提到用于容器间的通讯以及数据卷的挂载。至此K8S安装完成

K8S集群安装配置

  1. master主服务器配置,kubernetes-version表示安装K8S的版本,pod-network-cidr设置pod的虚拟IP范围
kubeadm init --kubernetes-version=v1.14.1 --pod-network-cidr=10.244.0.0/16

图中的第一个红框的命令是需要管理员手动复制,然后在master服务器上执行的。

  mkdir -p $HOME/.kube    #创建.kube目录
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config    #拷贝admin.conf文件到刚刚创建的目录
  sudo chown $(id -u):$(id -g) $HOME/.kube/config    #进行相应的授权

PS: admin.conf是kubeadm集群管理的核心配置文件,包含整个集群各个节点的授权信息,以及本身的一些配置信息

第二个红框中的命令是在node节点上执行,里面包含了一个加入集群的token认证信息以及ca证书的hashcode。通过该token可以加入K8S集群.

  1. 执行 kubectl get nodes 查看当前集群的所有节点

从图中看到master节点处于NotReady状态,说明节点中存在有问题的Pod,查看存在问题的pod,执行以下命令查看所有Pod状态

kubectl get pod --all-namespaces

如果某个Pod的STATUS处于CrashLoopBackOff状态表示创建失败了,那么它会不断自动重新创建。上图中两个coredns处于pending状态,原因是我们没有配置K8S网络通讯协议fannel,从上传的文件中加载并创建flannel网络组件

kubectl create -f kube-flannel.yml

3.在node节点上执行刚刚由kubeadm生成的节点加入命令

kubeadm join 192.168.220.131:6443 --token 25x9dp.3k4ysps4xeuv7lm5 \
    --discovery-token-ca-cert-hash sha256:ef7751d4347df3a8b401c53588c8ee8376cb100c7f14c550c2d175a266b8b6a9 

如果出现反复无法加入节点的情况,运行 kubeadm reset 这条命令还原当前节点上 kubeadm init 或者 kubeadm join 所做的所有更改。当想加入新节点忘记token时可以使用 kubeadm token list 查看token,或者 kubeadm token create创建token,采用跳过ca安全认证的方式加入节点。

kubeadm join 192.168.220.131:6443 --token 25x9dp.3k4ysps4xeuv7lm5  --discovery-token-unsafe-skip-ca-verification

4.三台机器设置kubelet开机自启,至此通过kubeadm集群配置完成

systemctl enable kubelet

安装K8S可视化仪表盘

在主节点上执行以下命令,以下三个配件都是已经配置好的,装载即可。

kubectl apply -f kubernetes-dashboard.yaml  # web-ui 配置文件
kubectl apply -f admin-role.yaml  # 角色配置
kubectl apply -f kubernetes-dashboard-admin.rbac.yaml #角色的权限配置
kubectl -n kube-system get svc  #获取系统命名空间下的所有服务

图中dashboard服务已经被创建,配置文件中关闭了密码验证,只需要浏览器打开 http://192.168.220.131:32000无需登录。

K8S仪表盘 进入docker
上一篇 下一篇

猜你喜欢

热点阅读