k8s安装

配置节点hosts文件

[root@localhost ~]# vi /etc/hosts
192.168.1.11 k8smaster
192.168.1.12 k8snode1
192.168.1.14 k8snode2

安装最新版本docker-ce

# 安装指定版本的docker(目前最新的1.14.0版本的kubenetes依赖的docker可以为1.13.1, 17.03, 17.06, 17.09, 18.06, 18.09):
# 如果版本不符合可以先卸载,再安装
[root@localhost ~]# yum -y remove docker*
[root@localhost ~]# rm -rf /var/lib/docker

# 阿里源开始安装
[root@localhost ~]# vi /etc/yum.repos.d/Ali-docker.repo
[ali.yun.com-docker]
name=aliyun
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/
enabled=1
gpgcheck=0
[root@localhost ~]# yum install -y docker-ce
[root@localhost ~]# systemctl enable docker.service && systemctl start docker.service

安装最新版本k8s

[root@localhost ~]# vi /etc/yum.repos.d/Ali-k8s.repo
[ali.yun.com-k8s]
name=aliyunk8s
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
[root@localhost ~]# yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
[root@localhost ~]# systemctl daemon-reload && systemctl enable kubelet && systemctl start kubelet

升级内核

# 安装之前需要先安装perl
[root@localhost ~]#  yum install perl -y
# ELRepo 仓库(可以先看一下 /etc/yum.repos.d/ 中是否有yum 源)
#也可以安装这个网站安装http://elrepo.org/tiki/tiki-index.php
[root@localhost ~]#  rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[root@localhost ~]#  rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

# 查看可用内核
[root@localhost ~]#  yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
# 查看所有内核
[root@localhost ~]#  yum --disablerepo="*" --enablerepo="elrepo-kernel" list available --showduplicates

# 安装最新内核,
[root@localhost ~]#  yum --enablerepo=elrepo-kernel install kernel-ml  

# 查看可用内核,一般上面安装的序号为0
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg

# 设置默认内核为最新的
[root@localhost ~]#  grub2-set-default 0

# 生成 grub 配置文件
[root@localhost ~]#  grub2-mkconfig -o /boot/grub2/grub.cfg

# 重启
[root@localhost ~]#  reboot

# 验证
uname -a

确保主机的唯一性

# 查看mac地址确认
cat /sys/class/net/ens33/address

# 查看确认UUID
cat /sys/class/dmi/id/product_uuid

关闭防火墙

[root@localhost ~]# systemctl disable firewalld.service && systemctl stop firewalld.service 

配置网桥的流量

# 加载模块
# 方法一
[root@localhost ~]# lsmod | grep br_netfilter  
# 方法二
[root@localhost ~]# modprobe br_netfilter 	//centos7需要敲一下,否则报错
# 配置各节点系统内核参数使流过网桥的流量也进入iptables/netfilter框架中
[root@localhost ~]# vi /etc/sysctl.conf 
net.bridge.bridge-nf-call-ip6tables = 1 
net.bridge.bridge-nf-call-iptables = 1
[root@localhost ~]# sysctl -p

关闭selinux

[root@localhost ~]# vi /etc/selinux/config
SELINUX=disabled

关闭swap

# K8s 1.8版本之后要求必须关闭
[root@localhost ~]# swapoff -a
[root@localhost ~]# cp /etc/fstab /etc/fstab_bak
[root@localhost ~]# vi /etc/fstab		//删除swap
[root@localhost ~]# vi /etc/sysctl.conf 
vm.swappiness = 0
[root@localhost ~]# sysctl -p

# 查看swap被关闭,全为0
[root@localhost ~]# free -m

启动kubernets

[root@localhost ~]# systemctl daemon-reload && systemctl enable kubelet && systemctl start kubelet

拉取核心组件镜像(翻墙不稳定可能需要多拉几次):

[root@localhost ~]# kubeadm config images pull

# 无法下载的话,需要看看需要下载的镜像:原因就是国内无法访问k8s.gcr.io
# 版本的查看
[root@localhost ~]# kubeadm version 
[root@localhost ~]# kubeadm config images list --kubernetes-version=v1.14.1
k8s.gcr.io/kube-apiserver:v1.14.1
k8s.gcr.io/kube-controller-manager:v1.14.1
k8s.gcr.io/kube-scheduler:v1.14.1
k8s.gcr.io/kube-proxy:v1.14.1
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.10
k8s.gcr.io/coredns:1.3.1

# 然后从docker的google的克隆镜像拉取,也可以从 registry.cn-hangzhou.aliyuncs.com/google_containers/去拉镜像,完事后更换tag:
docker pull mirrorgooglecontainers/kube-apiserver:v1.14.1
docker pull mirrorgooglecontainers/kube-controller-manager:v1.14.1
docker pull mirrorgooglecontainers/kube-scheduler:v1.14.1
docker pull mirrorgooglecontainers/kube-proxy:v1.14.1
docker pull mirrorgooglecontainers/pause:3.1
docker pull mirrorgooglecontainers/etcd:3.3.10
docker pull coredns/coredns:1.3.1

# 也可以使用方便的脚本
[root@localhost ~]# kubeadm config images list --kubernetes-version=v1.14.1 |sed -e 's/^/docker pull /g' -e 's#k8s.gcr.io#docker.io/mirrorgooglecontainers#g' |sh -x
# coredns这个镜像不在google的克隆镜像站中,需要单独下载:
[root@localhost ~]# docker pull coredns/coredns:1.3.1

# 方法一:就该就是一个一个的重新做tag,然后删除旧镜像。
# 重新打上google的tag
[root@localhost ~]# docker tag mirrorgooglecontainers/kube-apiserver:v1.13.0 k8s.gcr.io/kube-apiserver:v1.13.0
# 删除旧镜像
[root@localhost ~]# docker rmi mirrorgooglecontainers/kube-apiserver:v1.13.0

# 方法二:批量修改
[root@localhost ~]# docker images |grep mirrorgooglecontainers | awk '{print "docker tag ",$1":"$2,$1":"$2}' | sed -e 's#mirrorgooglecontainers#k8s.gcr.io#2' | sh -x
# 批量删除旧
[root@localhost ~]# docker images |grep mirrorgooglecontainers |awk '{print "docker rmi ", $1":"$2}' |sh -x
# coredns仍然需要但需修改
[root@localhost ~]# docker tag coredns/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1
[root@localhost ~]# docker rmi coredns/coredns:1.3.1 

Master 节点

至少2核4G内存
默认没有flanneld网络,Node节点间的pod不能通信,只能Node内通信,为了部署步骤简洁明了,故flanneld放在后面安装 flannel服务需要先于docker启动。flannel服务启动时主要做了以下几步的工作: 从etcd中获取network的配置信息 划分subnet,并在etcd中进行注册 将子网信息记录到/run/flannel/subnet.env中
所有节点及master上都要添加flannel:
也可以使用calico网络:
https://docs.projectcalico.org/v3.9/getting-started/kubernetes/

# 拉取flannel镜像
[root@localhost ~]# docker pull quay.io/coreos/flannel:v0.10.0-amd64

[root@localhost ~]# mkdir -p /etc/cni/net.d/

[root@localhost ~]# cat <<EOF> /etc/cni/net.d/10-flannel.conf
{"name":"cbr0","type":"flannel","delegate": {"isDefaultGateway": true}}
EOF

[root@localhost ~]# mkdir /usr/share/oci-umount/oci-umount.d -p
[root@localhost ~]# mkdir /run/flannel/

[root@localhost ~]# cat <<EOF> /run/flannel/subnet.env
FLANNEL_NETWORK=172.100.0.0/16
FLANNEL_SUBNET=172.100.1.0/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
EOF


# 如果需要修改网络类型
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart kubelet
[root@localhost ~]# systemctl restart docker

# 检查网络
[root@localhost ~]# cat /run/flannel/subnet.env

利用 kubeadm init 一键完成Master节点的安装:

[root@localhost ~]# kubeadm init --apiserver-advertise-address 192.168.1.10 --pod-network-cidr=10.244.0.0/16
# 如果中间出现错误,重新初始化:
[root@localhost ~]# kubeadm reset
[root@localhost ~]# kubeadm init --apiserver-advertise-address 192.168.1.11 --pod-network-cidr=10.244.0.0/16
如果cpu报错的话加上 --ignore-preflight-errors=NumCPU
![修改cgroups报错](https://img- blog.csdnimg.cn/20190924154442318.png)
[root@localhost ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml
# 如果之前已经启动了kubele 的话,那么需要在root用户下敲(这个可以不用现在敲,启动k8s后才会生成)
[root@localhost ~]# mkdir -p $HOME/.kube 
[root@localhost ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config 
[root@localhost ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

当然如果已经是 root 用户安装的(我这边本地虚拟机就是以root用户执行的),可以执行:
[root@localhost ~]# export KUBECONFIG=/etc/kubernetes/admin.conf

# 这里需要记录一下 kubeadm init 输出的 kubeadm join …… 命令,后面需要这个命令将各个节点加入集群中,先将它复制到其他地方备份,这玩意儿是真重要
[root@localhost ~]# kubeadm join 192.168.1.11:6443 --token x8q6av.yctsv9sunj2owl0c \
    --discovery-token-ca-cert-hash sha256:aacc10478759cfcc7f34cdd3d5ac47e798ae9a2e7ab51789ae2353e3a98a6254

#添加自动补全:
echo “source <(kubectl completion bash)” >> ~/.bashrc
客户端加入本集群

上述的令牌(已经加密,生命周期24小时)用于 master 和加入的 node 之间相互身份之间验证,凭借这个令牌可以让任何人将认证的节点加入到该集群,如果需要对令牌进行增、删、查的操作,可以使用 kubeadm token 命令,具体可参看kubeadm token。

[root@localhost ~]# kubeadm join 192.168.1.11:6443 --token x8q6av.yctsv9sunj2owl0c \
    --discovery-token-ca-cert-hash sha256:aacc10478759cfcc7f34cdd3d5ac47e798ae9a2e7ab51789ae2353e3a98a6254

根据它的提示,为了让 kubelet 为非root用户使用,需要作如下的一些配置:

[root@localhost ~]# mkdir -p $HOME/.kube
[root@localhost ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@localhost ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 当然如果已经是 root 用户安装的(我这边本地虚拟机就是以root用户执行的),可以执行:
[root@localhost ~]# export KUBECONFIG=/etc/kubernetes/admin.conf

查看集群状态:

[root@localhost ~]# kubectl get cs
NAME                			 STATUS    MESSAGE             ERROR
scheduler           		 	Healthy   	ok                  
controller-manager   	Healthy   	ok                  
etcd-0               			Healthy   	{"health":"true"}   

Pod 网络附加组件(重要)
 Pod 的网络组件很重要,这个组件主要作用是让 Pod 之间可以相互通信,该网络组件必须在任何应用部署之前进行部署,当然 CoreDNS 也只有在网络组件安装之后才能正常启动,kubeadm 仅仅支持基于网络(networks)的CNI(Container Network Interface),不支持 kubenet。有些项目提供了使用 CNI 的 k8s Pod,其中某些也支持网络协议。

POD网络不能与任何主机网络重叠,否则可能导致问题,如果发现网络插件的首选POD网络与某些主机网络发生冲突,应该考虑一个合适的CIDR替换,并在kubeadm init with–pod network cidr期间使用它,并将其作为网络插件yaml文件中的替换,根据上述集群初始化的输出提示,安装Pod的网路插件:

[root@localhost ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml

每个集群中仅且可以安装一个Pod网络组件,可选网络组件有:Calico、Canal、Cilium、Flannel、Kube-router等等,这里选用 Kube-router,将桥接的IPv4流量传递到IPtables的链(重要),这样才能使得 CNI 正常工作,只要把/proc/sys/net/bridge/bridge-nf-call-iptables设置为1即可(在准备工作中已经做过):

[root@localhost ~]# sysctl net.bridge.bridge-nf-call-iptables=1

Kube-router 依赖于 kube-controller-manager 为节点分配 CIDR(无类别域间路由,Classless Inter-Domain Routing),因此初始化kubeadm init时带上–pod-network-cidr标识,其实上述初始化过程中我已经带上了该标识,验证一下:

[root@localhost ~]# kubectl get pods --all-namespaces

# 结果
NAMESPACE     NAME                                READY   STATUS    RESTARTS   AGE
kube-system   coredns-fb8b8dccf-gzs2k             1/1     Running   0          27h
kube-system   coredns-fb8b8dccf-hs56b             1/1     Running   0          27h
kube-system   etcd-k8smaster                     		 1/1     Running   1          27h
kube-system   kube-apiserver-k8smaster           	 1/1     Running   1          27h
kube-system   kube-controller-manager-k8smaster   1/1     Running   1          27h
kube-system   kube-flannel-ds-z7r6t               	1/1     Running   0          5h31m
kube-system   kube-proxy-75w9l                   		 1/1     Running   1          27h
kube-system   kube-scheduler-k8smaster            1/1     Running   1          27h

kubectl get pods --all-namespaces是通过检测 CoreDNS 是否运行来判断网络组件是否正常安装。

Node节点
5.1 向集群中添加 worker node 节点
至少4核16G内存

<think>好的,我现在需要帮助用户在Linux系统上安装Kubernetes和Docker,特别是为Kubernetes配置Docker。用户之前提到在k8s-master节点安装Docker时遇到元数据下载失败的问题,现在需要更全面的安装和配置指南。 首先,我需要回顾之前的对话。用户上次的问题是关于解决Docker安装时的元数据下载失败,我给出了检查仓库配置、清理缓存、处理依赖冲突等步骤。现在用户的需求扩展到了安装Kubernetes和Docker的整体流程,并且要确保两者兼容。同时,用户提供了站内引用,其中提到了Docker常用命令和Kubernetes与Docker的关系,特别是Kubernetes不以Docker为核心依赖,但Docker作为容器运行时的一个选项。 接下来,我需要结合这些引用来构建回答。根据引用[1],用户可能需要了解Docker的基本操作,但当前问题更关注安装和配置。引用[2]指出Kubernetes设计上不依赖Docker,但Docker仍是可选运行时。因此,在安装过程中需要注意版本兼容性和配置,尤其是cgroup驱动,这点在之前的回答中也提到过。 用户现在的问题是如何在Linux系统中为k8s安装和配置Docker。我需要分步骤说明安装过程,包括系统准备、安装Docker、配置Docker以适配Kubernetes、验证安装以及可能的问题处理。同时,要参考之前的解决方案,比如仓库配置、依赖冲突处理等,确保Docker正确安装后能与Kubernetes协同工作。 需要注意的要点包括: 1. 系统要求:确保Linux版本符合Kubernetes和Docker的要求。 2. 安装Docker:使用正确的仓库源,处理可能的依赖问题。 3. 配置Docker:尤其是cgroup驱动改为systemd,这是Kubernetes推荐的做法。 4. 安装Kubernetes组件:kubeadm、kubelet、kubectl,并初始化集群。 5. 验证集群状态,确保Docker容器运行时被正确识别。 6. 故障排查:参考之前提到的元数据下载问题,以及网络配置等。 另外,用户可能需要知道如何验证Docker和Kubernetes的兼容性,以及如何处理常见问题,比如镜像拉取失败、cgroup驱动不匹配等。需要确保步骤清晰,命令准确,并且给出相关问题的提示,例如cgroup配置错误可能导致kubelet服务无法启动。 最后,根据用户之前的问题,生成的相关问题应该围绕安装后的配置、兼容性检查以及优化措施,比如如何验证Docker配置是否正确,如何处理网络插件问题等。</think>#### 分步安装与配置指南(以CentOS 8/9为例) --- ### 一、系统准备 1. **关闭Swap与防火墙** ```bash sudo swapoff -a && sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab # 永久禁用swap sudo systemctl stop firewalld && sudo systemctl disable firewalld # 关闭防火墙 ``` 2. **设置容器运行时预检参数** ```bash cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF sudo modprobe overlay && sudo modprobe br_netfilter ``` --- ### 二、Docker安装与配置 #### 1. 安装Docker(适配Kubernetes版本) ```bash # 配置阿里云镜像源(避免元数据错误) sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 安装指定版本(需匹配k8s兼容版本) sudo yum install -y docker-ce-20.10.23 docker-ce-cli-20.10.23 containerd.io ``` #### 2. **关键配置修改** ```bash # 配置cgroup驱动为systemd(必须与kubelet一致) sudo mkdir -p /etc/docker cat <<EOF | sudo tee /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"] } EOF ``` #### 3. 启动服务 ```bash sudo systemctl enable docker && sudo systemctl start docker ``` --- ### 三、Kubernetes组件安装 #### 1. 配置k8s仓库 ```bash cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=0 EOF ``` #### 2. 安装三件套 ```bash sudo yum install -y kubelet-1.28.4 kubeadm-1.28.4 kubectl-1.28.4 --disableexcludes=kubernetes ``` #### 3. 初始化Master节点 ```bash sudo kubeadm init \ --image-repository registry.aliyuncs.com/google_containers \ --pod-network-cidr=10.244.0.0/16 \ --cri-socket unix:///var/run/containerd/containerd.sock # 显式指定容器运行时接口 ``` --- ### 四、验证安装 1. **检查Docker运行时状态** ```bash docker info | grep -i cgroup # 应显示"systemd" kubectl get nodes -o wide # 检查节点状态是否Ready ``` 2. **查看容器运行时** ```bash kubectl get nodes -o jsonpath='{.items[*].status.nodeInfo.containerRuntimeVersion}' # 应显示:"docker://20.10.23" ``` --- ### 五、故障排查(重点场景) 1. **cgroup驱动不匹配** **现象**:kubelet日志报错`detected cgroupfs as the Docker cgroup driver` **解决**: - 修改`/etc/docker/daemon.json`后重启docker - 删除`/var/lib/kubelet`并重启kubelet 2. **镜像拉取失败** ```bash # 手动拉取核心镜像 kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers ``` --- ### 附加配置建议 1. **容器运行时切换准备** 若未来需切换containerd: ```bash sudo rm /etc/containerd/config.toml sudo systemctl restart containerd ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值