在 centos&Ubuntu 上安装 K8S教程

1 第一步 先安装docker

  1. 更新系统源
    如果系统本身自带得镜像地址,服务器在国外,下载速度会很慢,可以打开 /etc/apt/sources.lis 替换为国内得镜像源。
    apt upgrade
  2. 更新软件包
    将系统得软件组件更新至最新稳定版本。
    apt update
  3. 安装 Docker
    3.1 ubuntu 安装过程
    apt-get install docker.io
    3.2 如果需要配置为开机启动,可执行以下命令
    systemcd enable docker
    systemcd start docker

这里如果是 centos 可以使用:
yum install -y docker.ce
或者
wget -P /etc/yum.repos.d/ https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce

如果要配置 Docker 镜像加速,打开 /etc/docker/daemon.json 文件,registry-mirrors 增加或修改,加入https://registry.docker-cn.com 这个地址,也可以填写阿里云腾讯云等镜像加速地址。
示例
{
“registry-mirrors”: [

"https://kzflb.mirror.aliyuncs.com"

]

}

重启 Docker,使配置生效
sudo systemctl daemon-reload
sudo systemctl restart docker

当然也可以选择安装指定版本(毕竟生产环境使用服务不能太过激进)

用下面的命令可以查看可以安装的版本

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

例如:安装docker ce的版本18.03.0
yum install -y docker-ce-18.03.0.ce-1.el7.centos

2 第二步 安装 K8S (Kubernetes)

  1. 执行以下命令安装 https 工具以及 k8s。
    apt-get update && apt-get install -y apt-transport-https curl
    apt-get install -y kubelet kubeadm kubectl --allow-unauthenticated
    执行下面命令测试是否正常
    kubeadm init

如果安装时,出现下面情况,说明系统得镜像源中,找不到 k8s 的软件包。
No apt package “kubeadm”, but there is a snap with that name.
Try “snap install kubeadm”
No apt package “kubectl”, but there is a snap with that name.
Try “snap install kubectl”
No apt package “kubelet”, but there is a snap with that name.
Try “snap install kubelet”

2.1 ubuntu 更改

可以打开 /etc/apt/sources.list 文件,添加一行
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main

再次执行安装 K8s 的命令。
如果出现
The following signatures couldn’t be verified because the public key is not available

则执行下面命令,为期添加 key。
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add

上面命令,安装了 kubelet、kubeadm、kubectl ,kubelet 是 k8s 相关服务,kubectl 是 k8s 管理客户端,kubeadm 是部署工具。
centos 更改
cat >> /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF

2.2 初始化

如果是centos,关闭防火墙及关闭selinux
systemctl disable firewalld
systemctl stop firewalld
setenforce 0

执行下面命令进行初始化,会自动从网络中下载需要的 Docker 镜像。
此命令是用来部署主节点的(Master)。
执行 kubeadm version 查看版本,GitVersion:“v1.17.2” 中即为版本号。

2.2.1 执行以下命令初始化

先关闭swap
输入命令:swapoff -a
kubernetes关闭swap主要是为了性能考虑,当然如果不想关闭swap,需要:

  1. 编辑/etc/sysconfig/kubelet ,添加KUBELET_EXTRA_ARGS="–fail-swap-on=false"
    #cat /etc/sysconfig/kubelet
    KUBELET_EXTRA_ARGS="–fail-swap-on=false"
  2. 初始化:
    #kubeadm init --kubernetes-version=版本–pod-network-cidr=pod网络 --service-cidr=生成服务所在网络地址 --ignore-preflight-errors=Swap
    通过kubeadm初始化
kubeadm init --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=NumCPU

–ignore-preflight-errors=NumCPU 是在只有一个 CPU 的时候使用,例如 1G1M 的学生服务器。

可能遇到的问题:

  1. [preflight] Some fatal errors occurred:
    /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
    #解决方案:
    echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
    echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables

2.2.2 可能你需要下载镜像(因为被墙)

但是因为需要连接到 Google ,所以可能无法下载内容。
我们可以通过使用 kubeadm config images list 命令,列举需要拉取的镜像。我们来手动通过 Docker 拉取。这个过程比较麻烦,还需要手动修改镜像名称。
拉取方法 docker pull {镜像名称}。
Google 访问不了,不过 DockerHub 已经备份好需要的镜像。
mirrorgooglecontainers 这个仓库备份了相应的镜像。遗憾的是,镜像不一定都是最新的备份。阿里云上面的 google_containers 仓库应该是备份最新的。
例如需要以下镜像
k8s.gcr.io/kube-apiserver:v1.17.2
k8s.gcr.io/kube-controller-manager:v1.17.2
k8s.gcr.io/kube-scheduler:v1.17.2
k8s.gcr.io/kube-proxy:v1.17.2
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.5

则拉取对应的镜像,把下面的代码保存代码down.sh,然后 chomd 777 ./down.sh 赋予权限。

其中下载镜像的版本需要按照你的需求下载,本例子用的kubernetes v1.17.2,实际上v1.17+以上的版本我试验也是好使的。

#!/bin/bash
images=(
    kube-apiserver:v1.17.2
    kube-controller-manager:v1.17.2
    kube-scheduler:v1.17.2
    kube-proxy:v1.17.2
    pause:3.1
    etcd:3.4.3-0
    coredns:1.6.5
)
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}
        docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/${imageName}
done

最后执行 开头的初始化命令。
实在不行的话,可以尝试 https://learnku.com/articles/29209 中的安装教程。

2.2.3 使主节点生效

添加环境变量
export KUBECONFIG=/etc/kubernetes/admin.conf
也可以按照安装成功后的提示操作:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown k8s更新镜像分批发布 k8s升级镜像_docker(id -g) $HOME/.kube/config

3 第三步 添加网络插件

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

运行别人编写好的 yaml 配置文件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

这一步也可以自己编写 yaml 。
执行后出现
odsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds-amd64 created
daemonset.apps/kube-flannel-ds-arm64 created
daemonset.apps/kube-flannel-ds-arm created
daemonset.apps/kube-flannel-ds-ppc64le created
daemonset.apps/kube-flannel-ds-s390x created
这里如果安装flannel可能镜像下载不下来,可以采用手动下载:

手动拉取flannel的docker镜像

docker pull easzlab/flannel:v0.11.0-amd64

修改镜像名称

docker tag easzlab/flannel:v0.11.0-amd64 quay.io/coreos/flannel:v0.11.0-amd64

删除原来镜像标签

docker rmi easzlab/flannel:v0.11.0-amd64

保存使用配置
kubeadm join

7,查看 Node
执行以下命令查看 Node
kubectl get nodes

结果示例

root@instance-wxxixh4k:~# kubectl get nodes
NAME                STATUS   ROLES    AGE     VERSION
instance-wxxixh4k   Ready    master   9m23s   v1.17.2

说明已经成功了,并且能够添加移除 Node。

4 第四步 安装面板(可安可不按)

4.1 下载 yaml 配置文件

wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/alternative/kubernetes-dashboard.yaml

使用 cat kubernetes-dashboard.yaml 命令查看 yaml 文件内容,记录版本号。
文件中有类型以下内容的语句,后面的数字就是版本号。
image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1

拉取 kubernetes-dashboard 镜像(注意修改后面的版本号)。
docker pull registry.aliyuncs.com/google_containers/kubernetes-dashboard-amd64:v1.10.1
docker tag registry.aliyuncs.com/google_containers/kubernetes-dashboard-amd64:v1.10.1 k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1
docker rmi registry.aliyuncs.com/google_containers/kubernetes-dashboard-amd64:v1.10.1

安装 kubernetes-dashboard
kubectl create -f kubernetes-dashboard.yaml

查看安装结果

kubectl get pod --namespace=kube-system

配置面板,添加 Admin 账号和权限
复制粘贴下面内容到终端,按回车键。

cat < dashboard-admin.yaml
 apiVersion: rbac.authorization.k8s.io/v1beta1
 kind: ClusterRoleBinding
 metadata:
 name: kubernetes-dashboard
 labels:
 k8s-app: kubernetes-dashboard
 roleRef:
 apiGroup: rbac.authorization.k8s.io
 kind: ClusterRole
 name: cluster-admin
 subjects:• kind: ServiceAccount
 name: kubernetes-dashboard
 namespace: kube-system
 EOF

上面代码会创建一个 dashboard-admin.yaml 文件。
执行安装
kubectl create -f dashboard-admin.yaml

查看节点端口
kubectl get svc --namespace=kube-system

找到名为 kubernetes-dashboard 的节点,记录端口 。
查看 pod 名称
kubectl get pod --namespace=kube-system

其中有一个 kubernetes-dashboard 开头的,例如 kubernetes-dashboard-6bf999dbcc-nc4hq,记录名称。

4.2 访问面板(dashboard)

如果以下方法无法使用,请参考
https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/ 方法一:kubectl proxy
执行
kubectl proxy

内网即可使用下面地址访问
http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/ 方法二:API Server
访问方法
https://{master-ip}:{apiserver-port}/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
这里不再赘述,详细请参考网路资料。
方法三:直接暴露端口(NodePort)
不推荐使用。
执行
kubectl -n kube-system edit service kubernetes-dashboard

找到 type: ClusterIP,改成 type: NodePort。
另外 port 也可以改一下。
提示:
进入时,先使用方向键盘移动到合适位置;删除字符请使用 Delete 键;
然后按一下 Esc 键,按下 i 键进入编辑;
按一下 Esc 键,按一下 Shift + q,会提示输入内容,输入 wq! 保存并退出。
执行 kubectl -n kube-system get service kubernetes-dashboard 查看到端口映射。
例如
80:31901/TCP

则访问方法是 https://{ip}:31901
方法三
kubectl port-forward kubernetes-dashboard-6bf999dbcc-nc4hq 8080:80 --namespace=kube-system &

10,添加 Node 进行测试
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=8090 --type=NodePort

外网访问 8090 即可访问到 Nginx。