1. 简单介绍

Kubernetes 是 Google 开源的容器集群管理系统,基于 Docker 构建一个容器的调度服务,提供资
源调度、均衡容灾、服务注册、动态扩缩容等功能套件 的基于容器的云平台
官网:https://kubernetes.io/

1.1 概述

如果想使用kubernetes API对象来描述集群的预期状态(desired state):包括你需要运行的应用或者负载,它们使用的镜像、副本数,以及所需网络和磁盘资源等等。你可以使用命令行工具kubectl来调用kubernets API创建对象,通过所创建的这些对象来配置预期状态。也可以用Kubernets PI和集群进行交互,设置或者修改预期状态。

  • kubernets主控组件(master)包含三个进程,都运行在集群中的某个节点上,通常这个节点称为master节点。这些进程包括:kube-apiserverkube-controller-managerkube-scheduler
  • 集群中的每个非master节点都运行两个进程:
    1. kubelet:和master节点进行通信
    2. kube-peoxy:一种网络代理,讲Kubernets的网络服务代理到每个节点上

1.2Kubernets对象

Kubernets包含若干个抽象概念用来表示系统状态,包括:已部署的容器化应用和负载、与它们相关的网络和磁盘资源以及有关集群正在运行的其他操作的信息

基本的Kubernets对象包括:

  • Pod:pod是Kubernets项目中最小的API对象。也就是说是Kubernets项目的原子调度单位,一个pod可能包含一个或多个容器
  • Service:Kubernets之所以需要Service,一方面是应为Pod的IP不是固定的,另一方面则是应为一组POd实例之间总会有负载均衡的需求。service使用lable识别pod
  • Volume:用于同一pod内的容器进行数据共享等
  • Namespace:是对一组资源和对象的抽象集合,与编程中的namespace类似都是命名空间

另外,Kubernets包含大量的被称作控制器(controllers)的高级抽象。控制器给予基本对象构建并提供额外的功能和方便使用的特性,包括

  • ReplicaSet
  • Deployment
  • StatefulSet
  • DaemonSet
  • Job

2 安装

2.1 环境介绍

hostnameIPCPU内存
master192.168.1.10042G
etcd192.168.1.20042G
node1192.168.1.10142G
node2192.168.1.10242G

2.2 配置yum源

这里配置的是阿里云的yum源(在每台机器上都执行)

yum -y install wget
cd /etc/yum.repos.d/
# 备份系统自带的yum源
mkdir repo_bak
mv *.repo repo_bak/
# 下载yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 清空缓存
yum clean all
# 下载扩展源
yum -y install epel-release
yum clean all

2.3 安装配置软件

先关闭防火墙,线上业务根据实际情况允许访问(在每台机器上都执行)

systemctl stop firewalld && systemctl disable firewalld

2.3.1 etcd节点

软件安装
# 安装软件
yum -y install kubernetes flannel ntp etcd
# 修改hosts文件
echo -e "192.168.1.100 master\n192.168.1.200 etcd\n192.168.1.101 node1\n192.168.1.102 node2\n" >> /etc/hosts
软件配置
vim /etc/etcd/etcd.conf
# etcd存储数据的目录
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
# etcd对外监听地址,默认为2379
ETCD_LISTEN_CLIENT_URLS="http://localhost:2379,http://192.168.1.200:2379"
# etcd 节点名称
ETCD_NAME="etcd"
# 用来发送通知
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.200:2379"
启动并测试
systemctl start etcd
systemctl status etcd
systemctl enable etcd

查看端口号

netstat -anutp|grep 2379
tcp        0      0 127.0.0.1:2379          0.0.0.0:*               LISTEN      14157/etcd          
tcp        0      0 127.0.0.1:32810         127.0.0.1:2379          ESTABLISHED 14157/etcd          
tcp        0      0 127.0.0.1:2379          127.0.0.1:32810         ESTABLISHED 14157/etcd 

查看etcd成员(这里只有一台)

etcdctl member list
8e9e05c52164694d: name=etcd peerURLs=http://localhost:2380 clientURLs=http://192.168.1.200:2379 isLeader=true
配置etcd,制定容器云中docker的ip网段
etcdctl mkdir /k8s/network
etcdctl set /k8s/network/config '{"Network":"10.1.0.0/16"}'
etcdctl get /k8s/network/config
{"Network":"10.1.0.0/16"}

命令介绍

backup          backup an etcd directory
cluster-health  check the health of the etcd cluster
mk              make a new key with a given value
mkdir           make a new directory
rm              remove a key or a directory
rmdir           removes the key if it is an empty directory or a key-value pair
get             retrieve the value of a key
ls              retrieve a directory
set             set the value of a key
setdir          create a new directory or update an existing directory TTL
update          update an existing key with a given value
updatedir       update an existing directory
watch           watch a key for changes
exec-watch      watch a key for changes and exec an executable
member          member add, remove and list subcommands
user            user add, grant and revoke subcommands
role            role add, grant and revoke subcommands
auth            overall auth controls

2.3.2 master节点

软件安装
# 安装软件
yum -y install kubernetes flannel ntp
# 修改hosts文件
echo -e "192.168.1.100 master\n192.168.1.200 etcd\n192.168.1.101 node1\n192.168.1.102 node2\n" >> /etc/hosts
修改Kubernets配置文件
grep -E "^#|^$" /etc/kubernetes/config -v
# 表示错误日志记录到文件还是输出到stderr标准错误输出
KUBE_LOGTOSTDERR="--logtostderr=true"
# 日志等级
KUBE_LOG_LEVEL="--v=0"
# 是否允许运行特权容器 默认不允许
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://192.168.1.100:8080"
修改apiserver配置文件
grep -E "^#|^$" /etc/kubernetes/apiserver -v
# 监听的接口,如果配置为127.0.0.1则只监听localhost,配置为0.0.0.0会监听所有接口,这里配置为0.0.0.0
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
# etcd的服务地址
KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.1.200:2379"
# Kubernets可以分配的ip的范围,Kubernets启动的每一个pod以及service都会分配一个ip地址,将从这个范围中分配ip
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
# 这里不是线上环境,不做任何限制,默认情况下会先经过认证和授权,然后执行准入操作,最后对目标对象进行操作
KUBE_ADMISSION_CONTROL="--admission-control=AlwaysAdmit"
KUBE_API_ARGS=""
修改kube-controller-manager配置文件

默认配置即可

修改kube-scheduler配置文件
grep -E "^#|^$" /etc/kubernetes/scheduler -v
# 监听地址,默认为127.0.0.1
KUBE_SCHEDULER_ARGS="0.0.0.0"
配置flanneld服务
grep -E "^#|^$" /etc/sysconfig/flanneld  -v
FLANNEL_ETCD_ENDPOINTS="http://192.168.1.200:2379"
# 与etcd中的Network一致
FLANNEL_ETCD_PREFIX="/k8s/network"
# 指定通信的物理网卡
FLANNEL_OPTIONS="--iface=ens33"
启动服务并查看
# 启动服务
systemctl start flanneld.service
# 查看启动状态
systemctl status flanneld.service

查看网卡信息

ifconfig
flannel0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1472
        inet 10.1.80.0  netmask 255.255.0.0  destination 10.1.80.0
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 500  (UNSPEC)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

查看子网信息

cat /run/flannel/subnet.env
FLANNEL_NETWORK=10.1.0.0/16
FLANNEL_SUBNET=10.1.80.1/24
FLANNEL_MTU=1472
FLANNEL_IPMASQ=false
重启master上的四个服务并设置开机自启动
systemctl restart kube-apiserver.service kube-controller-manager.service kube-scheduler.service flanneld.service
# 开机自启动
systemctl enable kube-apiserver.service kube-controller-manager.service kube-scheduler.service flanneld.service

2.3.3 node(1、2)节点

软件安装
# 安装软件
yum -y install kubernetes flannel ntp
# 修改hosts文件
echo -e "192.168.1.100 master\n192.168.1.200 etcd\n192.168.1.101 node1\n192.168.1.102 node2\n" >> /etc/hosts
flanneld服务配置
grep -E "^#|^$" /etc/sysconfig/flanneld -v
FLANNEL_ETCD_ENDPOINTS="http://192.168.1.200:2379"
FLANNEL_ETCD_PREFIX="/k8s/network"
FLANNEL_OPTIONS="--iface=ens33"
配置master地址
grep -E "^#|^$" -v /etc/kubernetes/config
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://192.168.1.100:8080"
配置kube-proxy

默认不用配置

配置kubelet
grep -E "^#|^$" /etc/kubernetes/kubelet  -v
# 用来使用kubectl远程连接kubelet服务上,如果为127.0.0.1则无法连接kublet服务
KUBELET_ADDRESS="--address=0.0.0.0"
# node节点名称,便于标识
# KUBELET_HOSTNAME="--hostname-override=node2"
KUBELET_HOSTNAME="--hostname-override=node1"
# 指定apiserver地址
KUBELET_API_SERVER="--api-servers=http://192.168.1.100:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_ARGS=""

关闭selinux(或使用更高版本的系统)
vim /etc/sysconfig/docker
OPTIONS='--selinux-enabled=false --log-driver=journald --signature-verification=false'

错误信息

journalctl -xe


Error starting daemon: SELinux is not supported with the overlay2 graph driver on this kernel. Either boot into a newer kernel or disable selinux in docker (--selinux-enabled=false)
启动node服务
systemctl restart flanneld.service kube-proxy.service kubelet.service docker.service
systemctl enable flanneld.service kube-proxy.service kubelet.service docker.service
systemctl status flanneld.service kube-proxy.service kubelet.service docker.service

查看网卡信息

ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 10.1.49.1  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 02:42:81:18:60:61  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

flannel0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1472
        inet 10.1.49.0  netmask 255.255.0.0  destination 10.1.49.0
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 500  (UNSPEC)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

查看kube-proxy

netstat -anutp|grep proxy
tcp        0      0 127.0.0.1:10249         0.0.0.0:*               LISTEN      18040/kube-proxy    
tcp        0      0 192.168.1.101:46368     192.168.1.100:8080      ESTABLISHED 18040/kube-proxy    
tcp        0      0 192.168.1.101:46370     192.168.1.100:8080      ESTABLISHED 18040/kube-proxy

3 遇见的问题

3.1 pod-infrastructure镜像拉取失败导致pod状态处于ContainerCreating

上传pod-infrastructure镜像
在node节点kubelet文件中KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest",此容器为pod的基础容器,创建pod时会去拉取此镜像,由于有墙有可能拉取失败,导致pod创建处于ContainerCreating
上传pod-infrastructure
docker load -i pod-infrastructure.tar
导入pod-infrastructure

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐