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. MySQL组复制MGR(一)-- 技术概述

    (一)复制技术的发展 MySQL的复制技术主要经历了异步主从复制,半同步复制,组复制(Group Replication)3个阶段. (1)传统的异步主从复制 传统的MySQL提供了一种简单的主从复制 ...

  2. pandas之groupby分组与pivot_table透视

    一.groupby 类似excel的数据透视表,一般是按照行进行分组,使用方法如下. df.groupby(by=None, axis=0, level=None, as_index=True, so ...

  3. 使用ATOMac进行Mac自动化测试

    ATOMac简介 atomac是一个支持在mac上做自动化的python库,GitHub地址如下: https://github.com/pyatom/pyatom 安装 # Python2 sudo ...

  4. PHP入门之函数

    前言 之前对PHP的类型.运算符和流程控制简单说了一下.想了解的,这是地址. PHP入门之类型与运算符 PHP入门之流程控制 下面对函数简单说一下. 函数的基本概念 为完成某一个功能的程序指令的合集, ...

  5. More JOIN operations -- SQLZOO

    The JOIN operation 注意:where语句中对表示条件的需要用单引号, 下面的译文使用的是有道翻译如有不正确,请直接投诉有道 01.List the films where the y ...

  6. PHP Cookie是什么

    PHP Cookie cookie 常用于识别用户. Cookie 是什么? cookie 常用于识别用户.cookie 是一种服务器留在用户计算机上的小文件.每当同一台计算机通过浏览器请求页面时,这 ...

  7. PHP fread() 函数

    定义和用法 fread() 函数读取打开的文件. 函数会在到达指定长度或读到文件末尾(EOF)时(以先到者为准),停止运行. 该函数返回读取的字符串,如果失败则返回 FALSE. 语法 string ...

  8. luogu P5325 Min_25筛

    LINK:Min_25筛 新版感觉有点鬼畜 而且旧版的也够用了至少. 这个并不算很简单也不算很困难的知识点 学起来还是很麻烦的. (误入了很多dalao的blog 说的云里雾里的 甚是懵逼 这里推荐几 ...

  9. 发送ajax请求时候注意的问题

    1.在发送ajax请求一般都是默认为异步,就是不去等待后台响应直接可以继续发送, 但这样会有时候遇到一些问题,无法获得后台的响应参数, 所以在你打开编辑弹出框完成数据编辑后无法刷新页面, 这时候可能存 ...

  10. 利用Data Vault对数据仓库进行建模(二)

    写在前面 本篇先不讨论Data Vault其本身,因为不见得所有人都接受这个.但是里边有一些很不错的东西跟主流的数据仓库方法是有共同点的,所以这里主要讨论这些共同的方法,在笔者看来,无论是Kimbal ...