k8s集群+docker的简单入门

时间:2024-03-19 19:38:30

主机----虚拟机----容器docker(轻量级虚拟机)

一、Docker三剑客

  1. docker machine: 部署主机
  2. docker compose:通过文件在主机中运行多个APP
  3. docker swarm:容器编排工具,管理主机集群

mesos+marathon

mesos:管理IDC主机机房

marathon:容器的部署和管理

二、dockerkubernetes关系:

kubernetes(谷歌公司内部用,14年开源,16年云原生计算基金会)

docker:一家小公司的开源软件,后来原生支持kubernetes

三、 k8s对node和pod的支持

Node:2000台  pod:150000个

Master node和worker node

Master node:集群管理者

Worker node:提供应用运行的相关工作

k8s集群+docker的简单入门

k8s集群+docker的简单入门

四、修改主机名解析(IP与主机名对应关系)

修改主机名

1、方法一使用hostnamectl命令

[[email protected] ~]# hostnamectl set-hostname <Newname>

2、方法二:修改配置文件 /etc/hostname 保存退出

[[email protected] ~]# vi /etc/hostname

<Newname>

[[email protected] ~]#vim /etc/hosts

内容:192.168.154.100 master1

      192.168.154.101 worker1

      192.168.154.102 worker2

五、关闭防火墙

1、[[email protected] ~]# service firewall stop

2、[[email protected] ~]# systemctl disable fire

六、关闭seLinux

[[email protected] ~]# sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

七、安装、配置时间同步

安装:[[email protected] ~]# yum -y install ntpdate

配置:[[email protected] ~]# crontab –e  内容:0 */1 * * * ntpdate time1.aliyun.com

手动:[[email protected] ~]# ntpdate time1.aliyun.com

八、关闭交换分区fstab(不关,装k8s会报错)

[[email protected] ~]# vim /etc/fstab    (注释掉fstab)

内容:#/dev/mapper/centos-swap swap       swap    defaults      0 0

九、配置网桥过滤

[[email protected] ~]# vim /etc/sysctl.d/k8s.conf

内容:net.bridge.bridge-nf-call-ip6tables=1

net.bridge.bridge-nf-call-iptables=1

net.ipv4.ip_forward=1

vm.swappiness=0

加载模块:[[email protected] ~]# modprobe br_netfilter

查看是否加载:[[email protected] ~]# lsmod | grep br_netfilter

加载网桥过滤配置文件:sysctl -p /etc/sysctl.d/k8s.conf显示有内容说明已经配置到内核了

十、开启ipvs

1、安装ipset和ipvsadm

[[email protected] ~]# yum -y install ipset ipvsadm

2、加载模块

[[email protected] ~]# cat > /etc/sysconfig/modules/ipvs.modules <<EOF

#!/bin/bash

modprobe -- ip_vs

modprobe -- ip_vs_rr

modprobe -- ip_vs_wrr

modprobe -- ip_vs_sh

modprobe -- nf_conntrack_ipv4

EOF

加权限然后用sh执行:

[[email protected] ~]# ll /etc/sysconfig/modules/

[[email protected] ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules

[[email protected] ~]# sh /etc/sysconfig/modules/ipvs.modules

检查加载情况:[[email protected] ~]# lsmod | grep ip_vs_rr

十一、安装docker-ce(k8s只能管理到pos节点,pos里包含docker,所以要借助docker-ce来完成管理)

  1. yum源获取

[[email protected]~]# wget -o /etc/yum.repos.d/docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo

查看是否成功:ls /etc/yum.repos.d/

PS:插入一个问题

做完第1步以后,第2步yum提示找不到源Error: File contains no section headers

解决办法:

[[email protected] ~]#   yum install -y yum-utils

[[email protected] ~]# yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo

  1. 查看、安装和验证docker-ce

查看:[[email protected] ~]# yum list docker-ce.x86_64 --showduplicates | sort -r (导入GPG的时候要输入y回车) 

安装:[[email protected] ~]# yum -y install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7

验证:[[email protected] ~]# docker version

 

十二、设置开机自启动和开启docker-ce

开机启动:systemctl enable docker.service

启动:systemctl start docker.service

如果想用第三方插件或者其他版本

要修改:[[email protected] ~]# vim /usr/lib/systemd/system/docker.service

修改内容1:[Service]

Type=notify

ExecStart=/usr/bin/dockerd  (如果原文有-H选项,删除-H和后面所以内容)

      修改内容2:[[email protected] ~]# vim /etc/docker/daemon.json     #添加驱动

                                 {

"exec-opts":["native.cgroupdriver=systemd"]

}

                   

十三、安装k8s软件kubeadm、kubelet、kubectl

1、添加k8s.repo源

[[email protected] ~]# vim /etc/yum.repos.d/k8s.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

linux系统下用scp命令互传文件

[[email protected] ~]# scp /etc/yum.repos.d/k8s.repo worker2:/etc/yum.repos.d/

 

2、安装:kubeadm、kubelet、kubectl

[[email protected] ~]# yum list | grep kubeadm  (会提示导入key,输入y然后在打一次同样的命令)

查版本:[[email protected] ~]# yum list kubeadm.x86_64 --showduplicates | sort -r

安装: [[email protected] ~]# yum -y install --setopt=obsoletes=0 kubeadm-版本号 kubelet-版本号kubectl-版本号     (可以不加版本号,默认安装最新版本)rpm --import /etc/pki/rpm-gpg/RPM*

 

Ps: [[email protected] ~]# vim /etc/yum.repos.d/k8s.repo这里面的gpgkey下面的连接必须空格,不然会报错:安装获取 GPG **失败:[Errno 14] HTTPS Error 404 - Not Found

 

  1. kubelet配置

为了实现docker使用的cgroupdriver与kubelet使用的cgroup的一致性

建议修改:[[email protected] ~]# vim /etc/sysconfig/kubelet

                  内容:KUBELET_EXTRA_ARGS=”--cgroup-driver=systemd”

然后设置开机启动:systemctl enable kubelet.service

 

十四、k8s初始化(kubeadm对k8s进行初始化时,集群组件是以容器的方式进行)

  1. 准备k8s集群容器镜像(俗称:拉镜像,可以从国外或国内拉)
  1. 查看需要使用的镜像都有哪些:

[[email protected] ~]#kubeadm config images list

  1. 列出镜像列表到文件,便于下载使用:

[[email protected] ~]#kubeadm config images list >>image.list (把需要的镜像导出到列表)

  1. 查看已列出镜像文件列表:

[[email protected] ~]# cat image.list 

[[email protected] ~]# vim image.list  (编辑image.list添加如下内容,作用:下载镜像)

#!/bin/bash

img_list='

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.18.2

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.18.2

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.18.2

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.18.2

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.7

'

for img in ${img_list}

do

   docker pull $img

done

执行任务:[[email protected] ~]# sh image.list

查看下载结果:docker images

PS:如果上面的链接无效的话要另外找!

    •  下载完后要改标签:连续执行命令

docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.18.2 k8s.gcr.io/kube-apiserver:v1.18.2 && docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.18.2 k8s.gcr.io/kube-controller-manager:v1.18.2 && docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.18.2 k8s.gcr.io/kube-scheduler:v1.18.2 && docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.18.2 k8s.gcr.io/kube-proxy:v1.18.2 && docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2 && docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0 k8s.gcr.io/etcd:3.4.3-0 && docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.7 k8s.gcr.io/coredns:1.6.7

 

    • 连续执行命令(删除镜像):

有三种方式:分号 ; 和 && 和 ||

分号是不论对错都执行,&&遇到执行失败的命令停止,||遇到执行成功的命令就停止,两命令之间要留空格

docker image rm registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.7 && docker image rm registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0 && docker image rm registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 && docker image rm registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.18.2 && docker image rm registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.18.2 && docker image rm registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.18.2 && docker image rm registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.18.2

 

    • Worker节点只需要k8s.gcr.io/kube-proxy:v1.18.2和k8s.gcr.io/pause:3.2

把这两个镜像传到worker1和worker2节点上

[[email protected] ~]# docker save -o kube-proxy.tar k8s.gcr.io/kube-proxy:v1.18.2

[[email protected] ~]# docker save -o pause.tar k8s.gcr.io/pause:3.2

[[email protected] ~]# scp kube-proxy.tar pause.tar worker1:/root

[[email protected] ~]# scp kube-proxy.tar pause.tar worker2:/root

⑤ 在worker1和worker2导入镜像

   [[email protected] ~]# docker load -i kube-proxy.tar

   [[email protected] ~]# docker load -i pause.tar

⑥备份镜像(方便传到node节点上用)

[[email protected] ~]#docker save k8s.gcr.io/kube-proxy:v1.18.5 \

            k8s.gcr.io/kube-apiserver:v1.18.5 \

            k8s.gcr.io/kube-controller-manager:v1.18.5 \

            k8s.gcr.io/kube-scheduler:v1.18.5 \

            k8s.gcr.io/pause:3.2 \

            k8s.gcr.io/coredns:1.6.7 \

            k8s.gcr.io/etcd:3.4.3-0 > k8s-imagesV1.18.5.tar

 

  1. K8s涉及三层网络:节点网络,集群网络,pod网络

kubenets初始化:kubeadm init --kubernetes-version=v1.18.2 --pod-network-cidr=172.16.0.0/16 --apiserver-advertise-address=192.168.154.100 (绿色为pod网络,黄色为节点网络)

插入一个重要错误:

报错: [kubelet-check] Initial timeout of 40s passed.

[kubelet-check] It seems like the kubelet isn't running or healthy.

[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get http://localhost:10248/healthz: dial tcp [::1]:10248: connect: connection refused.

      排查:[[email protected] ~]# journalctl -xefu kubelet

原因:7 10 16:55:08 master1 kubelet[13638]: F0710 16:55:08.957443   13638 server.go:164] unknown command: --cgroup-driver=systemd

(回滚到十三的第3点,添加的KUBELET_EXTRA_ARGS=”--cgroup-driver=systemd”不能被识别,导致docker的cgroup和kubelet的cgroup不一致,kubelet启动不成功)

解决:1、把KUBELET_EXTRA_ARGS=”--cgroup-driver=systemd”删掉

2、在[[email protected] ~]# vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf

添加内容:Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd"

ExecStart=/usr/bin/kubelet $KUBELET_CONFIG_ARGS

          拓展说明:vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf这个文件是kubelet的运行配置文件(正常来说:文件上半部分的Environent=有几个ARGS,下面的ExecStart=就会有几个),这个文件配的不正确会导致kubelet平台启动不成功,另外,kubelet是通过kubeadm init 或者kubeadm join等操作来启动的,而不是手动启动,手动启动的只有kubelet的主进程,运行状态会显示为:active(auto-reset)正常是active(running)

 

处理上面的错误后,初始化成功,然后进行:为日常使用集群的用户添加kubectl使用权限

[[email protected] ~]# mkdir -p $HOME/.kube

[[email protected] ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

[[email protected] ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

十五、网络配置(两种)

1、使用flannel搭建overlay型网络

#下载flannel最新配置文件:[[email protected] ~]# yum install -y wget

下载kube-flannel:[[email protected] ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

安装kube-flannel:[[email protected] ~]# kubectl apply -f kube-flannel.yml

查看nodes状态:[[email protected] ~]# kubectl get nodes

如果STATUS提示NotReady,可以通过 kubectl describe node kube-master 查看具体的描述信息,性能差的服务器到达Ready状态时间会长些

2、使用calico搭建非overlay型网络

首先,要想办法拿到calico的镜像,两种办法:

  • 在CSDN等网站手动下载calico的镜像,然后用docker load –i导入到节点
    • 找到可以拉取镜像的连接,用docker pull拉镜像。

拓展说明:Overlay网络需要封包和解包,理论上要比非overlay要多占用资源,速度也就慢。

十六、把worker添加到master

  1. 在worker节点申请添加到master上来

[[email protected] ~]# kubeadm join 192.168.154.100:6443 --token zrwawn.oibshx46mc9vi225 \

    --discovery-token-ca-cert-hash sha256:dab8291d5e508c74841ee400922280dd72e5e56170114dd4d08c0e6e4aa2a59f

4、如果kube-master初始化的时候不记得token,可以新申请创建一个:

[[email protected] ~]#kubeadm token create --print-join-command

PS:好像token是有有效期的,过一段时间就不能用了。

34点问题很多:大多都是node节点加不上master,老以为是因为kubelet没有启动造成,其实是vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf文件没有配置正确,可以回到上面的十四点的(4)看看。

主要解决办法:

①vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf这个文件正常来说:文件上半部分的Environent=有几个ARGS,下面的ExecStart=就会有几个

       ②把docker 的cgroupfs和kubelet的cgroupfs设置为一样的systemd。

 

                                                                                                                                       

最后补充一个节点Joni错误:

error execution phase preflight: couldn't validate the identity of the API Server: could not find a JWS signature in the cluster-info ConfigMap for token ID "8l6t3i"

初步判断是token的问题,但是重启后又能正常join了。奇怪!