centos7.8 安装部署 k8s 集群

刚接触 k8s,配置环境折腾了一天,感觉有很多坑,网上很多教程已经不靠谱了,自己记录下安装部署 k8s 的全过程。

环境说明

software version
OS CentOS Linux release 7.8.2003 (Core)
Docker 18.09.6
kubelet v1.14.2
kubeadm v1.14.2
kubectl v1.14.2
flannel v0.9.1

Docker 安装

  1. 安装依赖
yum install -y yum-utils   device-mapper-persistent-data   lvm2
  1. 设置 Docker 源
yum-config-manager     --add-repo     https://download.docker.com/linux/centos/docker-ce.repo
  1. 安装 Docker CE

docker 安装版本查看

yum list docker-ce --showduplicates | sort -r

安装 Docker,指定版本

yum install docker-ce-18.09.6 docker-ce-cli-18.09.6 containerd.io
  1. 启动 Docker
systemctl start docker	# 启动 docker服务

systemctl enable docker # 设置开机启动 docker
  1. 命令补全

安装 bash-completion

yum -y install bash-completion

source /etc/profile.d/bash_completion.sh
  1. 镜像加速

可以在 https://cr.console.aliyun.com 中获取自己的加速域名

配置 daemon.json 文件

mkdir -p /etc/docker

cd /etc/docker && vim daemon.json

# 修改文件
{
"registry-mirrors": [
"https://xxxxxx.mirror.aliyuncs.com"
]
}
  1. 重启服务
systemctl daemon-reload

system restart docker
  1. 验证
docker --version

docker run hello-world

k8s 安装准备工作

注意 centos 禁用防火墙和 selinux,并且设置 阿里源

  1. 修改主机名
hostnamectl set-hostname master

cat /etc/hostname	# 查看
  1. 修改 hosts (多节点配置)
cat >> /etc/hosts << EOF
xxx.xxx.xxx.xxx master
xxx.xxx.xxx.xxx node01
xxx.xxx.xxx.xxx node02
EOF
  1. 禁用 swap
# 临时禁用
swapoff -a # 永久禁用
sed -i.bak '/swap/s/^/#/' /etc/fstab
  1. 内核参数修改(重要,不然出现 bug 找半天原因…… )
# 临时修改
sysctl net.bridge.bridge-nf-call-iptables=1
sysctl net.bridge.bridge-nf-call-ip6tables=1 # 永久修改
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF sysctl -p /etc/sysctl.d/k8s.conf
  1. 修改 Cgroup Driver

修改 /etc/docker/daemon.json

{
"registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}

重新加载 docker

systemctl daemon-reload

systemctl restart docker
  1. 设置 kubernetes 源

新增 k8s 源

cat <<EOF > /etc/yum.repos.d/kubernetes.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
EOF

更新缓存

yum clean all

yum -y makecache

Master 节点安装 k8s

版本查看

yum list kubelet --showduplicates | sort -r

安装 kubelet,kubeadm,kubectl

  1. 指定版本安装
yum install -y kubelet-1.14.2

yum install -y kubeadm-1.14.2

yum install -y kubectl-1.14.2
  • kubelet 运行在集群所有节点上,用于启动Pod和容器等对象的工具
  • kubeadm 用于初始化集群,启动集群的命令工具
  • kubectl 用于和集群通信的命令行,通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
  1. 启动 kubelet 并设置开机启动
systemctl enable kubelet && systemctl start kubelet
  1. Kubelet 命令补全

https://kubernetes.io/zh/docs/tasks/tools/install-kubectl/

(我使用的 zsh,bash 和 zsh 有所不同)

Bash:

echo "source <(kubectl completion bash)" >> ~/.bash_profile
source .bash_profile

Zsh:

if [ $commands[kubectl] ]; then
source <(kubectl completion zsh)
fi

如果是 On-My-Zsh,需要在 plugin 中加入

plugins=(kubectl)

下载镜像

Kubernetes几乎所有的安装组件和Docker镜像都放在goolge自己的网站上,直接访问可能会有网络问题,这里的解决办法是从阿里云镜像仓库下载镜像,拉取到本地以后改回默认的镜像tag。

  1. 新建 image.sh 脚本。
#!/bin/bash
url=registry.cn-hangzhou.aliyuncs.com/google_containers
version=v1.14.2
images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`)
for imagename in ${images[@]} ; do
docker pull $url/$imagename
docker tag $url/$imagename k8s.gcr.io/$imagename
docker rmi -f $url/$imagename
done
  1. 下载镜像
chmod u+x image.sh

./image.sh

docker images

初始化 Master

  1. 初始化
kubeadm init
  1. 加载环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

source .bash_profile

如果不是在 root 用户下执行,需要执行以下操作:

mkdir -p $HOME/.kube

cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

chown $(id -u):$(id -g) $HOME/.kube/config
  1. 安装 pod 网络

拉取镜像

docker pull quay.io/coreos/flannel:v0.9.1-amd64
mkdir -p /etc/cni/net.d/

cat <<EOF> /etc/cni/net.d/10-flannel.conf
{"name":"cbr0","type":"flannel","delegate": {"isDefaultGateway": true}}
EOF

设置环境变量

mkdir /usr/share/oci-umount/oci-umount.d -p
mkdir /run/flannel/
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

开启网络

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml
  1. master 节点配置

默认情况下集群不会在master上调度pod,如果偏想在master上调度Pod,可以执行如下操作:

查看 taint

 kubectl describe node master|grep -i taints

删除默认污点

kubectl taint nodes master node-role.kubernetes.io/master-

这个涉及 k8s 的 taint 污点和 toleration 容忍机制,可以自己查阅文档。

Master Pod 配置例子

  1. 查看 master 节点的 taint 配置
$ kubectl describe node master

查看到 taint 配置为

...
Taints: node.kubernetes.io/not-ready:NoExecute
node.kubernetes.io/not-ready:NoSchedule
key=value:PreferNoSchedule
...
  1. 在 Pod 中配置能够分配 toleration,使其能够分配使用

添加配置:

spec:
tolerations:
- key: node.kubernetes.io/not-ready
operator: Exists
effect: NoSchedule
  1. 运行 Pod
$ kubectl create -f mysql.yaml

$ kubectl describe pod mysql
...
Normal Scheduled 4m35s default-scheduler Successfully assigned default/mysql-rm2dv to master ...

启动测试

启动 nginx 实例并且访问

  1. 命令方式
kubectl run httpd-app --image=httpd --replicas=3
  1. 配置文件方式
$ cat >> nginx.yml << EOF
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
restartPolicy: Always
containers:
- name: nginx
image: nginx:latest
EOF $ kubectl apply -f nginx.yml
  1. 状态查看
kubectl get nodes

kubectl get svc		# 查看服务所开放的端口
  1. 查看 pod 状态
kubectl get pod --all-namespaces
  1. 查看副本数目
kubectl get deployments

kubectl get pod -o wide
  1. 查看集群基本组件状态
kubectl get cs
  1. 访问

在其他机器上访问即可,通过 nodePort 暴露端口。


漫长的过程,还有很多报错和问题随后再开个帖子记录。

参考文章

centos7.8 安装部署 k8s 集群的更多相关文章

  1. kubernetes系列03—kubeadm安装部署K8S集群

    本文收录在容器技术学习系列文章总目录 1.kubernetes安装介绍 1.1 K8S架构图 1.2 K8S搭建安装示意图 1.3 安装kubernetes方法 1.3.1 方法1:使用kubeadm ...

  2. centos7下安装部署mongodb集群(副本集模式)

    环境需求:Mongodb集群有三种模式:  Replica Set, Sharding,Master-Slaver.  这里部署的是Replica Set模式. 测试环境: 这里副本集(Replica ...

  3. 使用kubeadm部署k8s集群[v1.18.0]

    使用kubeadm部署k8s集群 环境 IP地址 主机名 节点 10.0.0.63 k8s-master1 master1 10.0.0.63 k8s-master2 master2 10.0.0.6 ...

  4. 二进制方法-部署k8s集群部署1.18版本

    二进制方法-部署k8s集群部署1.18版本 1. 前置知识点 1.1 生产环境可部署kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式 kuberadm Kubea ...

  5. Kubernetes后台数据库etcd:安装部署etcd集群,数据备份与恢复

    目录 一.系统环境 二.前言 三.etcd数据库 3.1 概述 四.安装部署etcd单节点 4.1 环境介绍 4.2 配置节点的基本环境 4.3 安装部署etcd单节点 4.4 使用客户端访问etcd ...

  6. 【02】Kubernets:使用 kubeadm 部署 K8S 集群

    写在前面的话 通过上一节,知道了 K8S 有 Master / Node 组成,但是具体怎么个组成法,就是这一节具体谈的内容.概念性的东西我们会尽量以实验的形式将其复现. 部署 K8S 集群 互联网常 ...

  7. 部署K8S集群

    1.Kubernetes 1.1.概念 kubernetes(通常称为k8s)用于自动部署.扩展和管理容器化应用程序的开源系统.它旨在提供“跨主机集群的自动部署.扩展以及运行应用程序容器的平台”.支持 ...

  8. 菜鸟系列k8s——快速部署k8s集群

    快速部署k8s集群 1. 安装Rancher Rancher是业界唯一完全开源的企业级容器管理平台,为企业用户提供在生产环境中落地使用容器所需的一切功能与组件. Rancher2.0基于Kuberne ...

  9. Ansible自动化部署K8S集群

    Ansible自动化部署K8S集群 1.1 Ansible介绍 Ansible是一种IT自动化工具.它可以配置系统,部署软件以及协调更高级的IT任务,例如持续部署,滚动更新.Ansible适用于管理企 ...

随机推荐

  1. PHP系列之钩子

    PHP 提供的钩子 PHP 和 Zend Engine 为扩展提供了许多不同的钩子,这些扩展允许扩展开发人员以 PHP userland 无法提供的方式控制 PHP 运行时. 本章将展示各种钩子和从扩 ...

  2. 自制廉价的LED+LCD型投影仪

    文档标识符:PROJECTOR_T-D-P6 作者:DLHC 最后修改日期:2020.7.30 本文链接:https://www.cnblogs.com/DLHC-TECH/p/PROJECTOR_T ...

  3. Python os.pathconf() 方法

    概述 os.pathconf() 方法用于返回一个打开的文件的系统配置信息.高佣联盟 www.cgewang.com Unix 平台下可用. 语法 fpathconf()方法语法格式如下: os.fp ...

  4. NOI On Line 提高组题解

    (话说其实我想填的是去年CSP的坑...但是貌似有一道题我还不会写咕咕咕... 先写一下这一次的题解吧. T1:序列.题意省略. 两种操作.这种题要先分析部分分 给出了全部都是2操作的子任务. 发现A ...

  5. Lambda表达式运行原理

    目录 一.创建测试样例 二.利用Java命令编译分析 三.文末 JDK8引入了Lambda表达式以后,对我们写代码提供了很大的便利,那么Lambda表达式是如何运用简单表示来达到运行效果的呢?今天,我 ...

  6. Latex—参考文献

    在写文章的最后最让我头疼的就是参考文献的问题了.网上的资料也有很多,这里整合了很多资料得出了一个用bib文件的方法. 1.  显示确定参考文献(一句没什么用的废话). 2.  利用谷歌学术(镜像),如 ...

  7. 类加载Class Loading

    JVM 何时.如何把 Class 文件加载到内存,形成可以直接使用的 Java 类型,并开始执行代码? ​ 类的生命周期 加载 - 连接(验证.准备.解析)- 初始化 - 使用 - 卸载. 注意,加载 ...

  8. 【NOIP2013】火柴排队 题解(贪心+归并排序)

    前言:一道水题. ----------------------- 题目链接 题目大意:给出数列$a_i$和$b_i$,问使$\sum_{i=1}^n (a_i-b_i)^2$最小的最少操作次数. 首先 ...

  9. beyond compare4 密钥 亲测可用

    beyond compare4过了试用期: 密钥: w4G-in5u3SH75RoB3VZIX8htiZgw4ELilwvPcHAIQWfwfXv5n0IHDp5hv1BM3+H1XygMtiE0-J ...

  10. python8.3多进程

    from multiprocessing import Processimport time def run1 (name,sex): print(name,sex,"执行进程1" ...