kubernets(k8s)安裝配置

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 環境介紹

hostname IP CPU 內存
master 192.168.1.100 4 2G
etcd 192.168.1.200 4 2G
node1 192.168.1.101 4 2G
node2 192.168.1.102 4 2G

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章