Ubuntu 18.04 搭建单节点 k8s 记录 (不需要科学上网的方案)

ubuntu 安装 k8s

安装环境

  • 阿里云服务器: 1C2G
  • ubuntu 18.04
  • kubernetes 1.14.2
# 设置环境变量, 命令行看着舒服点
export PS1="\[\033[33m\]\u\[\033[0m\]@\[\033[36m\]k8s\[\033[0m\]:\[\033[32m\]\W \[\033[0m\]$ "

# vim 显示行号
cat <<EOF > ~/.vimrc
set nu
EOF

# 一些初始配置
apt update
apt -y install apt-transport-https ca-certificates curl software-properties-common

# 写入两个 key
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add -
curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -

# 添加镜像源
cat <<EOF >/etc/apt/sources.list.d/docker-k8s.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable
EOF

# 更新并安装
apt update && apt install -y docker-ce kubelet kubeadm kubectl

# 关闭 swap
swapoff -a
vim /etc/fstab # 注释 01

# 设置阿里云镜像加速, 也可以不用弄这个
cat <<EOF >/etc/docker/daemon.json
{
    "registry-mirrors": ["https://{阿里云分配的地址}.mirror.aliyuncs.com"]
}
EOF

# 安装镜像包
kubeadm config images list # 注释 03

# 初始化
kubeadm init --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=NumCPU # 注释 02

# 根据初始化之后输出的内容, 使用这个命令将其他节点加入集群

# 设置网络插件
export KUBECONFIG=/etc/kubernetes/admin.conf
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

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

# 拉取 kubernetes-dashboard 镜像, 注意版本, 可在 kubernetes-dashboard.yaml 文件中查看
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

# 直接为 Dashboard 赋予 Admin 的权限

# 新建 dashboard-admin.yaml 文件, 注意缩进

cat <<EOF > 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

# 安装
kubectl create -f dashboard-admin.yaml

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

# 单节点情况下, 无法操作节点
kubectl taint nodes --all node-role.kubernetes.io/master-

## END ######################################################

# 不直接为 Dashboard 赋予 Admin 的权限
# 创建账户
kubectl create serviceaccount k8sadmin -n kube-system
kubectl create clusterrolebinding k8sadmin --clusterrole=cluster-admin --serviceaccount=kube-system:k8sadmin

# 查看账号是否建立成功
kubectl get sa --all-namespaces

# 获取 Token 登陆
kubectl get secret -n kube-system | grep k8sadmin | cut -d "  " -f1 | xargs -n 1 | xargs kubectl get secret -o 'jsonpath={.data.token}' -n kube-system | base64 --decode

# 端口转发, kubernetes-dashboard-54fb766c84-psnrh 是通过 `kubectl get pod --namespace=kube-system` 查出来的
kubectl port-forward kubernetes-dashboard-54fb766c84-psnrh 8443:8443 --namespace=kube-system &

注释 01

# 注释掉这一行
# /swapfile none swap sw 0 0

注释 02

  • init 常用主要参数:

    • –kubernetes-version: 指定Kubenetes版本,如果不指定该参数,会从google网站下载最新的版本信息。
    • –pod-network-cidr: 指定pod网络的IP地址范围,它的值取决于你在下一步选择的哪个网络网络插件,比如我在本文中使用的是 flannel 网络,需要指定为10.244.0.0/16。
    • –apiserver-advertise-address: 指定master服务发布的Ip地址,如果不指定,则会自动检测网络接口,通常是内网IP。

      kubeadm init 输出的token用于master和加入节点间的身份认证,token是机密的,需要保证它的安全,因为拥有此标记的人都可以随意向集群中添加节点。

  • 如果只有一个 cpu 请加参数: --ignore-preflight-errors=NumCPU

注释 03

k8s-pull.sh

# 将对应的包, 从国内镜像上拉下来
for  i  in  `kubeadm config images list`;  do
    imageName=${i#k8s.gcr.io/}
    docker pull registry.aliyuncs.com/google_containers/$imageName
    docker tag registry.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
    docker rmi registry.aliyuncs.com/google_containers/$imageName
done;
本作品采用《CC 协议》,转载必须注明作者和本文链接
nfangxu
讨论数量: 4

:+1: :+1:

4年前 评论

请问这个问题怎么解决 This error is likely caused by: - The kubelet is not running - The kubelet is unhealthy due to a misconfiguration of the node in some way (required cgroups disabled)

1年前 评论
kopa-kongpan (作者) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!