前言

简单搭建的方法

step1、准备两个虚拟机,并进行相应的设置

1.1、设置主机名

ubuntu 18.04不能直接修改/etc/hostname中主机名称,重启后又恢复到安装时设置的主机名称.正确的修改步骤如下:

1.首先修改/etc/cloud/cloud.cfg

1
2
sudo vim /etc/cloud/cloud.cfg
#找到preserve_hostname: false修改为preserve_hostname: true

2.修改主机名

1
2
#修改主机名(临时)
#hostname k8s-master
1
2
3
#修改主机名(永久)
#然后改为需要的主机名后存盘退出
sudo vim /etc/hostname
1
2
3
#映射主机名
sudo vim /etc/hosts
#192.168.1.xxx 主机名
1
sudo reboot

重启后新的主机名就生效了,但是要注意不能将还原preserve_hostname: false,否则下次重新后主机名又被覆盖了.

1.2 关闭swap内存

这个swap其实可以类比成 windows 上的虚拟内存,它可以让服务器在内存吃满的情况下可以保持低效运行,而不是直接卡死。但是 k8s 的较新版本都要求关闭swap。所以咱们直接动手,修改/etc/fstab文件:

sudo vim /etc/fstab

你应该可以看到如下内容,把第二条用#注释掉就好了,注意第一条别注释了,不然重启之后系统有可能会报file system read-only错误。

1
2
UUID=e10891b2-0cd9-4f02-8557-05b481f770c9 / ext4 defaults 0 0
#/swap.img	none	swap	sw	0	0

重启并查看设置是否成功:

1
2
3
4
# 重启
reboot
#查看
free -h
              total        used        free      shared  buff/cache   available
Mem:           3.8G        274M        1.9G        1.4M        1.7G        3.3G
Swap:            0B          0B          0B

说明关闭swap成功

1.3、配置免密登录

root用户开启远程登录

sudo vim /etc/ssh/sshd_config
# 找到 
PermitRootLogin prohibit-password
# 改成
PermitRootLogin yes

生成公钥

如下命令生成公钥,默认会在~/.ssh/下生成id_rsaid_rsa.pub。先检查一下机器是否已有公钥,如果没有再执行:

1
ssh-keygen -t rsa

-t 指定算法 -f 指定生成秘钥路径 -N 指定密码

拷贝公钥

1
2
3
cd ~/.ssh
scp id_rsa.pub root@k8s-worker:/root/.ssh/authorized_keys #此命令在k8s-master机器执行,目的将公钥发送至k8s-worker机器
scp id_rsa.pub root@k8s-master:/root/.ssh/authorized_keys #此命令在k8s-worker机器执行,目的将公钥发送至k8s-master机器

验证

ssh k8s-worker #在k8s-master机器上,看是否免密登陆k8s-worker
ssh k8s-master #在k8s-worker机器上,看是否免密登陆k8s-master

如果发现设置免密登陆,还需要输入密码,那么检查一下/root .ssh authorized_keys目录和文件的权限。

chmod 600 authorized_keys 
chmod 700 .ssh

step2、容器初始化

1.1、docker安装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# step 4: 更新并安装Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce
#step 5:添加用户组信息并将ubuntu添加到组内
sudo usermod -aG docker ubuntu
#step 6:重启
reboot

1.2、k8s安装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# root用户下,执行如下命令
# step 1: 安装必要的一些系统工具
apt-get update && apt-get install -y apt-transport-https
# step 2: 安装GPG证书
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - 
# step 3: 写入软件源信息
cat << EOF > /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF 
# step 4: 更新并安装 kubectl,kubeadm以及 kubelet
apt-get update
apt-get install -y kubelet kubeadm kubectl

1.3、获取当前版本kubeadm 启动需要的镜像

使用如下命令:

kubeadm config images list

结果如下:

k8s.gcr.io/kube-apiserver:v1.18.0
k8s.gcr.io/kube-controller-manager:v1.18.0
k8s.gcr.io/kube-scheduler:v1.18.0
k8s.gcr.io/kube-proxy:v1.18.0
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.7

需要访问Google你懂的

可从阿里云的镜像替换为谷歌的镜像

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash
images=(
    kube-apiserver-amd64:v1.18.0
    kube-controller-manager-amd64:v1.18.0
    kube-scheduler-amd64:v1.18.0
    kube-proxy-amd64:v1.18.0
    pause:3.2
    etcd-amd64:3.4.3-0
    coredns:1.6.7
    
    kubernetes-dashboard-amd64:v1.10.0
    heapster-amd64:v1.7.0
    heapster-grafana-amd64:v4.4.3
    heapster-influxdb-amd64:v1.3.3
)

for imageName in ${images[@]} ; do
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
    docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
done

1.4 初始化集群

1
2
3
4
kubeadm init \
--apiserver-advertise-address=192.168.229.128 \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--pod-network-cidr=10.244.0.0/16

结果

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.229.128:6443 --token tgb5h2.ufrhcna7nbw5g3h7 \
    --discovery-token-ca-cert-hash sha256:aedef087c3a9f6505eb83d1edcd9492426ffb290a9092f9466baef1411d22446 

1.5 执行相关命令

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

1.6 worker节点加入

kubeadm join 192.168.229.128:6443 --token tgb5h2.ufrhcna7nbw5g3h7 \
    --discovery-token-ca-cert-hash sha256:aedef087c3a9f6505eb83d1edcd9492426ffb290a9092f9466baef1411d22446 

1.7 后续工作(可选)

  1. Kubernetes 将Pod调度到Master节点

出于安全考虑,默认配置下Kubernetes不会将Pod调度到Master节点。如果希望将k8s-master也当作Node使用,可以执行如下命令:

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

其中k8s-master是主机节点hostname如果要恢复Master Only状态,执行如下命令:

kubectl taint node k8s-master node-role.kubernetes.io/master=:NoSchedule
  1. 解决代码不自动补全
kubectl completion bash >> ~/.bashrc 
source ~/.bashrc