本片文章讲述使用 kubeadm 来安装K8S, 一般安装K8S集群的时候是使用 yun install kubernetes , 因为安装过程中需要修改各个组件启动参数, 整个过程比较复杂而且容易出错, 于是Kubernetes 开始引入 kubeadm 来简化集群部署的过程
在测试环境可以使用单节点Master, Node节点依据实际需求而定
为了保证高可用. 建议在生产环境使用多个Master节点做冗余.
安装docker, 此处不在赘述, 可以参考:
rm -rfv /etc/yum.repos.d/*
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
先关闭swap
swapoff -a
注释掉swap分区, 注释掉 /etc/fstab
中的swap 分区, 没有的话可以忽略
先输入
cat > /etc/sysctl.d/k8s.conf <<EOF
在输入:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
yum install vim bash-completion net-tools gcc -y
执行 cat <
之后输入下面的内容
[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 install kubectl kubelet kubeadm
systemctl enable kubelet
172.31.179.140
为当前主机的IP, 版本号是刚刚记下来的版本号
kubeadm init --kubernetes-version=1.18.2 \
--apiserver-advertise-address=172.31.179.140 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.10.0.0/16 --pod-network-cidr=10.122.0.0/16
如下所示则是成功
记下下面的信息, 启用kubectl和其他节点加入使用,
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.122.21:6443 --token v2r5a4.veazy2xhzetpktfz \
--discovery-token-ca-cert-hash sha256:daded8514c8350f7c238204979039ff9884d5b595ca950ba8bbce80724fd65d4
依据之前的提示
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
使用命令如下, 我们使用的root, 不用 chown
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
执行 source 使他生效
source <(kubectl completion bash)
测试命令
node节点为NotReady,因为corednspod没有启动,缺少网络pod
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
kubectl get pod --all-namespaces
下载官方的yaml, 然后修改一下
wget https://kuboard.cn/install-script/k8s-dashboard/v2.0.0-beta5.yaml
因为版本迭代 链接可能失效, 可以到官网查看最新的链接, 两个链接一般下面的那个会生效的
https://kuboard.cn/install/install-k8s-dashboard.html#
修改下载的yaml,官方部署dashboard的服务没使用nodeport要修改如下
vim v2.0.0-beta5.yaml
v2.0.0-beta5.yaml 是刚刚下载的文件, 之后修改其中的Service
如下图:
执行命令应用yaml
kubectl create -f v2.0.0-beta5.yaml
查看创建的POD和Service
kubectl get pod -n kubernetes-dashboard
kubectl get svc -n kubernetes-dashboard
使用刚刚修改的定义的 nodePort , 30001 发现无法访问, 是K8S要求对应的浏览器必须装安全证书才可以, 或者使用火狐浏览器, 可以不用装安全证书
https://kubernetes.io/docs/tasks/administer-cluster/access-cluster-api/
使用火狐浏览器可以不用下面的操作.
执行如下命令
grep 'client-certificate-data' /etc/kubernetes/admin.conf | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.crt
grep 'client-key-data' /etc/kubernetes/admin.conf | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.key
openssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out kubecfg.p12 -name "kubernetes-client"
最后一个命令需要密码. 输入记下来
将生成的 kubecfg.p12
文件导入chrome, windows 下面双击安装即可, 导入到受信任的根证书颁发机构, 有了证书访问的时候要使用K8s 安装的IP, 如果使用内网IP安装, 在外网使用外网IP访问, 无法生效.
执行如下命令添加ServiceAccount
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kube-system
EOF
创建ClusterRoleBinding和ClusterRoleBinding
cat <<EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kube-system
EOF
使用下面的命令获取token
bash
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')