Admin
2020-10-25:
搭建 Kubernetes(一) 跟着官方文档从零搭建K8S
搭建的踩坑文档 干货!Kubernates集群搭建及初始化spring cloud环境中遇到的坑
Dashboard参考 部署k8s,安装kubernetes-dashboard Web UI
修改主机名 k8s-master、 k8s-node1 …
hostnamectl set-hostname k8s-master
然后编辑文件 /etc/hosts,新增主机名和IP地址关系:
192.168.1.114 k8s-master192.168.1.115 k8s-node1
关闭防火墙
systemctl stop firewalldsystemctl disable firewalld
编辑文件 /etc/selinux/config,修改为 SELINUX=disabled,重启生效
编辑文件 /etc/fstab,注释 swap 行,重启生效
安装并启用 docker:
yum install -y dockersystemctl enable dockersystemctl start docker
新建文件 /etc/yum.repos.d/kubernetes.repo:
[kubernetes]name=Kubernetesbaseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64enabled=1gpgcheck=1repo_gpgcheck=1gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgexclude=kube*
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetessystemctl enable kubelet && systemctl start kubelet
确保文件 /etc/sysctl.d/k8s.conf 内容:
net.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1
生效:
sysctl --system
生成配置文件:
kubeadm config print init-defaults > kubeadm-init.yaml
advertiseAddress 值为本机网卡IPimageRepository 值为 imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers使用配置文件,初始化:
kubeadm config images pull --config kubeadm-init.yamlkubeadm init --config kubeadm-init.yaml
成功输出的最后两行,记得 保存:
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/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configYou 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.1.114:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:c5ad42d6716552b2cb7d07bb776305fa124b86024d4ab5c1b92bf134ee7cbb9e
允许 root 用户执行 kubectl:
mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config
下载配置文件:
wget https://docs.projectcalico.org/v3.8/manifests/calico.yaml
踩坑文里建议不要改直接用,的确建立完成集群没什么问题,过了一个星期服务器重启后发现以下现象:
curl cip.cc服务名 访问集群内部署的其他服务,例如: curl nginx-8082:8082,nginx-8082 是一个nginx服务,对集群内暴露端口 8082NodePort 方式对外暴露的服务,只能通过真实节点IP端口访问,无法通过集群内其他节点IP端口访问参考 k8s master节点nodePort方式不能访问服务,编辑文件 calico.yaml:
修改 CALICO_IPV4POOL_CIDR 的值与文件 kubeadm-init.yaml 内 serviceSubnet 的值一致:
省略- name: CALICO_IPV4POOL_CIDRvalue: "10.96.0.0/12"省略
在 # Auto-detect the BGP IP address. 前加入 IP_AUTODETECTION_METHOD:
省略# Specify interface- name: IP_AUTODETECTION_METHODvalue: "interface=enp.*"# Auto-detect the BGP IP address.- name: IPvalue: "autodetect"省略
enp.* 是宿主机网卡名称前缀,命令 ifconfig 查询应用生效:
kubectl apply -f calico.yaml
稍等几分钟,查看节点状态,直到 Ready:
[root@k8s-master k8s]# kubectl get nodesNAME STATUS ROLES AGE VERSIONk8s-master Ready master 106m v1.19.3
一般情况下, master 节点都不提供部署能力,所以单节点情况下需要让 master 节点同时作为 node,否则后续部署应用时会提示 0/1 nodes are available: 1 node(s) had taints that the pod didn't tolerate:
kubectl taint nodes --all node-role.kubernetes.io/master-
做完 准备 和 #安装Kubernetes 全部步骤
加入集群,使用 master 初始化的凭证:
kubeadm join 192.168.1.114:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:c5ad42d6716552b2cb7d07bb776305fa124b86024d4ab5c1b92bf134ee7cbb9e
如果凭证超过有效期(24小时),参考 kubernetes join 卡住 token过期 需要到 master 节点手动生成
生成永久凭证:
kubeadm token create --ttl 0
查询:
kubeadm token listopenssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
TOKEN列,对应加入集群命令参数 tokendiscovery-token-ca-cert-hash,一般不会变替换参数后重新加入集群,到 master 节点,等待几分钟,直到 Ready:
[root@k8s-master k8s]# kubectl get nodesNAME STATUS ROLES AGE VERSIONk8s-master Ready master 2d4h v1.19.3k8s-node1 Ready <none> 118s v1.19.3
Dashboard不是必须的,但是有它可以省很多事:
node/service/pod 等状态一目了然下载文件:
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml
编辑文件 recommended.yaml
修改超时时间(默认900秒),在 - --namespace=kubernetes-dashboard 后添加行 - --token-ttl=86400:
省略args:- --auto-generate-certificates- --namespace=kubernetes-dashboard- --token-ttl=86400省略
暴露服务,改为 NodePort 方式,在 targetPort: 8443 后添加两行 nodePort: 30002 和 type: NodePort:
省略spec:ports:- port: 443targetPort: 8443nodePort: 30002type: NodePort省略
应用生效:
kubectl apply -f recommended.yaml
然后,访问 https://master节点ip:30002即可,暂时还无法登录
thisisunsafe 即可跳过用户 然后生成 Token 的方式新建文件 dashboard-adminuser.yaml:
apiVersion: v1kind: ServiceAccountmetadata:name: admin-usernamespace: kube-system---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata:name: admin-userroleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-adminsubjects:- kind: ServiceAccountname: admin-usernamespace: kube-system
应用生效:
kubectl apply -f dashboard-adminuser.yaml
获取 token:
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
生成的 token 可以保存到文件,打开 dashboard 网页,输入 token,即可登录:


暂时没发现什么用途,跳过吧
需要访问 dashboard 网页的电脑,拷贝证书文件 kubecfg.p12 后,手动导入证书:
打开Chrome - 设置 - 隐私设置和安全性 - 安全 - 管理证书 - 导入 - 选择证书文件 - 输入证书密码

然后访问,就会弹窗提示有可用证书

证书可以用来远程访问集群
kubectl 使用证书访问控制集群因为初始化集群,已经将服务器的 kubectl 自动配置到集群 api server 了,所以使用服务器 kubectl 配置生成证书相关文件:
grep 'certificate-authority-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.cagrep 'client-certificate-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.crtgrep 'client-key-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.keyopenssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out kubecfg.p12 -name "kubernetes-client"
保存密码,请 记住客户端访问远程集群,需要下载和服务器相同版本的 kubectl
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.19.3/bin/linux/amd64/kubectlchmod +x kubectlsudo mv kubectl /usr/bin/
参考 kubectl 通过配置文件添加上下文访问远程集群 配置集群证书
https://192.168.1.114:6443/home/wood/kubrenetes/114/114,以后可以使用这个名字切换已配置的不同的集群 kubectl config use-context 114
kubectl config set-cluster only-k8s --server https://192.168.1.114:6443 --certificate-authority=/home/wood/kubrenetes/114/kubecfg.cakubectl config set-credentials kubernetes-admin --client-certificate=/home/wood/kubrenetes/114/kubecfg.crt --client-key=/home/wood/kubrenetes/114/kubecfg.keykubectl config set-context 114 --cluster=only-k8s --namespace=default --user=kubernetes-adminkubectl config use-context 114
然后测试,能否访问集群:
kubectl versionkubectl get nodes