前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Ubuntu18.04搭建kubernetes集群(一个master一个node)

Ubuntu18.04搭建kubernetes集群(一个master一个node)

原创
作者头像
yaxin
修改2020-03-30 19:56:18
4.3K0
修改2020-03-30 19:56:18
举报
文章被收录于专栏:DevOps Boy

最近在学习kubernetes(之后都称为k8s),在跟着kubernetes交互式文档学习玩基本概念等知识后,想着自己也搭建一个集群,加深一下对其的理解。

0x01 机器配置

为了简单(懒得安装系统),这里直接使用了腾讯云广州(

https://console.qcloud.com/cvm/index)的机器。我这边选择了广州四区S4.MEDIUM4(2核4G)的按量付费机器,直接开了两台,一台用作master,一台用作node。综合下来平均每台0.69元/小时(机器费)+

0.80元/GB(贷款费),算是比较经济实惠了,当然你也可以在本地虚拟机搭建。

机器配置

0x02 设置代理

因为k8s需要拉取google cloud上的镜像,在中国大陆可能会比较慢,所以这里先在k8s机器上开一下代理(需要你有相应的代理服务器),我这里使用了v2ray,具体配置这里就不多说了。最后在两台机器上实现了一个监听12345端口的http代理客户端,后面docker等设置需要使用到这个代理。

当然这步也不是必须的,如果你使用腾讯云中国(中国香港)机器的话就无需关注这步。

开通之后的两台机器的IP分别为,分配如下:

master

node

10.11.10.6

10.11.10.13

0x03 系统配置

关闭swap

k8s要求系统关闭swap,否则会无法安装启动,使用下面的命令关闭swap

代码语言:javascript
复制
swapoff -a
sysctl -w vm.swappiness=0

编辑/etc/fstab,确保其中没有swap的配置启用,如果有使用#注释或者直接删除。

关闭swap

设置主机名

因为使用kubectl get nodes默认看到的node名称均为主机名,所以为了方便识别这里分别对两台主机的主机名做配置。

主机

IP

主机名

master

10.11.10.6

k8s-master

node

10.11.10.13

k8s-node-01

配置主机名需要使用到hostnamectl命令:

代码语言:javascript
复制
hostnamectl set-hostname k8s-master

0x04 安装配置docker

该步骤需要在两台机器上分别部署。

ubuntu上安装docker的具体文档,请参考:[

https://docs.docker.com/install/linux/docker-ce/ubuntu/](

https://docs.docker.com/install/linux/docker-ce/ubuntu/),我这里提取了关键步骤,直接在命令行中运行即可。

代码语言:javascript
复制
apt-get update
apt-get remove -y docker docker-engine docker.io containerd runc
apt-get install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
curl -fsSL https://mirrors.cloud.tencent.com/docker-ce/linux/ubuntu/gpg | apt-key add -
apt-key fingerprint 0EBFCD88
add-apt-repository \
   "deb [arch=amd64] https://mirrors.cloud.tencent.com/docker-ce/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io

安装后需要对其进行一下简单的配置:

代码语言:javascript
复制
cat <<EOF > /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "registry-mirrors": [
    "https://dockerhub.azk8s.cn"
  ]
}
EOF

然后配置docker使用第二步中搭建的http代理:

代码语言:javascript
复制
mkdir -p /etc/systemd/system/docker.service.d
cat <<EOF > /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:12345" "HTTPS_PROXY=http://127.0.0.1:12345" "NO_PROXY=docker.mirrors.ustc.edu.cn,10.*.*.*,localhost,127.0.0.1"
EOF

将docker设置为开机自启,然后重启docker

代码语言:javascript
复制
systemctl enable docker
systemctl restart docker

0x05 安装kubelet、kubeadm和kubectl等工具

该步骤需要在两台机器上分别部署。

  • kubelet运行在所有节点上,负责启动pod和容器。
  • kubeadm用于初始化集群。
  • kubectl是k8s的命令行工具。通过kubectl命令可以部署和管理应用等。

k8s并未提供这些工具在ubuntu 18.04的源,需要使用16.04(xenial)的源,当然这个并没有什么影响。

代码语言:javascript
复制
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl

0x06 初始化master

该步骤仅需在master机器上操作。

代码语言:javascript
复制
# 因为kubeadm init命令可能会访问k8s.io(https://dl.k8s.io/release/stable-1.txt),所以这里设置一下命令行代理
export http_proxy=http://127.0.0.1:12345
export https_proxy=http://127.0.0.1:12345
export no_proxy="docker.mirrors.ustc.edu.cn,10.*.*.*,localhost,127.0.0.1"
kubeadm init --pod-network-cidr=10.244.0.0/16

当然这个命令还有很多参数,常用的参数有:

  • --kubernetes-version: 指定Kubenetes版本,如果不指定该参数,会从google网站下载最新的版本信息。
  • --pod-network-cidr: 指定pod网络的IP地址范围,它的值取决于你在下一步选择的哪个网络网络插件,这里设置为10.244.0.0/16,因为我们后面会使用flannel网络方案。
  • --apiserver-advertise-address: 指定master使用哪个inteface与node节点通信,如果有多个interface建议指明,如果不指定,则会自动选择默认网关的interface。我们这里因为只有一块网卡,所以就不指定了。

kubeadm init

init之后会看到最后一行输出,这个复制保存,用于node加入集群使用。

然后创建kubectl命令的配置,其默认配置位于当前用户家目录的.kube文件夹下。如果你之后要使用一个普通用户(非root)来执行kubectl命令,那么你可以切换成普通用户然后再执行下面的命令,之后所有kubectl命令都需要用该用户执行。

代码语言:javascript
复制
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

创建好kubectl的配置文件之后,使用该命令安装一下网络插件(flannel)。

代码语言:javascript
复制
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

之后再使用下面的命令就可以看到所有系统说启动pods,如果状态不全是RUNNING的话,需要稍等片刻,等所有的pod全部启动完毕。

代码语言:javascript
复制
kubectl get pods --all-namespaces

下图是所有pod全部正常后的输出,此时表明master节点已经部署完毕。

系统pod

0x07 配置node加入集群

该步骤仅需在node机器上操作。

使用上一步中kubeadm init最后输出命令行,在需要配置为node的机器上执行。

代码语言:javascript
复制
kubeadm join 10.11.10.6:6443 --token d5bsdr.gqtjk98nnkiyb4pq \
    --discovery-token-ca-cert-hash sha256:60f6f6833611dd60ea9449fbd9dcb3b533c81602f032bbb8db8cb91c41ebc3a0

加入master

执行完毕后去master节点上执行kubectl get node,这时应该可以看到已经出现了一个状态为NotReady的node节点。之所以还未ready,是因为node节点正在拉取镜像并部署启动pods。

nodes

你可以在node节点的机器上使用docker imagesdocker ps来查看。

等node上的pods部署完之后,在master上执行kubectl get nodes,应该可以看到一个Ready状态的node。

上步中查询得到的node的ROLES显示为<none>,需要我们手动指定其为worker。

代码语言:javascript
复制
kubectl label node k8s-node-01 node-role.kubernetes.io/worker=worker

0x08 总结

自此我们就完成了一个k8s集群(一个master一个node)的搭建,总结起来整个过程就是安装docker、kubelet、kubeadm、kubectl等工具的过程。其中dokcer是最终应用所运行的环境,包括k8s系统本身也是在docker中运行;而kubelet作为一个daemon(systemd管理),负责启动pod和容器,这也是k8s中唯一一个以在宿主机中启动的后台进程;kubeadm用于初始化集群,部署完成之后就不会再用了。而kubectl是k8s的命令行工具,是我们之后使用的主要命令行工具,包括管理pod、service等。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x01 机器配置
  • 0x02 设置代理
  • 0x03 系统配置
    • 关闭swap
      • 设置主机名
      • 0x04 安装配置docker
      • 0x05 安装kubelet、kubeadm和kubectl等工具
      • 0x06 初始化master
      • 0x07 配置node加入集群
      • 0x08 总结
      相关产品与服务
      容器镜像服务
      容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档