节点规划
准备部署一主两从 的 三节点 Kubernetes集群,整体节点规划如下表所示:
主机名 | IP | 角色 |
---|---|---|
k8s-master | 192.168.10.246 | 主节点 |
k8s-node-1 | 192.168.10.254 | 从节点1 |
k8s-node-2 | 192.168.10.170 | 从节点2 |
所有节点都需要安装以下组件:
- Docker
- kubelet
- kubeadm
- kubectl
所有节点关闭防火墙
systemctl disable firewalld.service systemctl stop firewalld.service
禁用SELINUX
setenforce 0 vi /etc/selinux/config SELINUX=disabled
临时关闭 swap
swapoff -a
分别设置主机名
hostnamectl --static set-hostname k8s-master hostnamectl --static set-hostname k8s-node-1 hostnamectl --static set-hostname k8s-node-2
所有节点 主机名/IP加上 hosts解析,编辑 /etc/hosts 文件,加入以下内容:
192.168.10.246 k8s-master 192.168.10.254 k8s-node-1 192.168.10.170 k8s-node-2
修改yum源
vi /etc/yum.repos.d/kubernetes.repo
[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
安装 kubelet kubeadm kubectl
yum install -y kubelet-1.18.1-0 kubeadm-1.18.1-0 kubectl-1.18.1-0 systemctl enable kubelet && systemctl start kubelet
master配置
主节点执行:apiserver-advertise-address 为主节点 ip
kubeadm init --kubernetes-version=v1.18.1 --apiserver-advertise-address 192.168.10.246 --pod-network-cidr=10.244.0.0/16 --image-repository=registry.aliyuncs.com/google_containers
参数解释:
–kubernetes-version: 用于指定k8s版本; –apiserver-advertise-address:用于指定kube-apiserver监听的ip地址,就是 master本机IP地址。 –pod-network-cidr:用于指定Pod的网络范围; 10.244.0.0/16 –service-cidr:用于指定SVC的网络范围; –image-repository: 指定阿里云镜像仓库地址
这一步很关键,由于kubeadm 默认从官网k8s.grc.io下载所需镜像,国内无法访问,因此需要通过–image-repository指定阿里云镜像仓库地址。
上述命令执行完后注意保存输出 的 token 和hash 值.
配置 kubectl
在 Master上 root⽤户执行如下列命令来配置 kubectl:
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile source /etc/profile echo $KUBECONFIG
安装Pod网络
sysctl net.bridge.bridge-nf-call-iptables=1
master 执行:
kubectl apply -f kube-flannel.yaml
yaml 文件地址:https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
如果yml中的”Network”: “10.244.0.0/16″和kubeadm init xxx –pod-network-cidr不一样,就需要修改成一样的。不然可能会使得Node间Cluster IP不通。
查看yaml需要的镜像:
cat kube-flannel.yml |grep image|uniq image: quay.io/coreos/flannel:v0.12.0-amd64 image: quay.io/coreos/flannel:v0.12.0-arm64 image: quay.io/coreos/flannel:v0.12.0-arm image: quay.io/coreos/flannel:v0.12.0-ppc64le image: quay.io/coreos/flannel:v0.12.0-s390x
注意:这些镜像都是需要访问谷歌才行的。
但是阿里云容器镜像服务ACR里面是有的,访问链接如下:
https://www.aliyun.com/product/acr
注意:必须使用阿里云账号登录才行。
例如:
docker pull registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-amd64 docker pull registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-arm64 docker pull registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-arm docker pull registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-ppc64le docker pull registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-s390x
为镜像打tag,保持和yaml文件一样。
ocker tag registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-amd64 quay.io/coreos/flannel:v0.12.0-amd64 docker tag registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-arm64 quay.io/coreos/flannel:v0.12.0-arm64 docker tag registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-arm quay.io/coreos/flannel:v0.12.0-arm docker tag registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-ppc64le quay.io/coreos/flannel:v0.12.0-ppc64le docker tag registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-s390x quay.io/coreos/flannel:v0.12.0-s390x
注意:这些镜像,也需要在node节点执行。
kubectl apply -f kube-flannel.yml
等待几分钟,查看pod 状态 都处于Running状态
kubectl get pod --all-namespaces -o wide
node 加入集群
在每个 从节点执行
kubeadm join 192.168.10.246:6443 --token rkt1p6.3m7z7pqfvaehxmxi \ --discovery-token-ca-cert-hash sha256:dd384c51b5a38cce275dd3e178f6f1601b644f5fc2bc2f8cee9c2b031b1191
在 master 查看
kubectl get nodes -o wide
如果 token忘记,则可以去 Master上执行如下命令来获取:
kubeadm token list
hash 重新查看 master 执行
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
安装 dashboard
下载 yaml
https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml
修改如下内容:
--- #增加直接访问端口 kind: Service apiVersion: v1 metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kubernetes-dashboard spec: type: NodePort #增加 ports: - port: 443 targetPort: 8443 nodePort: 30008 #增加 selector: k8s-app: kubernetes-dashboard --- #因为自动生成的证书很多浏览器无法使用,所以我们自己创建,注释掉kubernetes-dashboard-certs对象声明 #apiVersion: v1 #kind: Secret #metadata: # labels: # k8s-app: kubernetes-dashboard # name: kubernetes-dashboard-certs # namespace: kubernetes-dashboard #type: Opaque ---
配置证书:
mkdir dashboard-certs cd dashboard-certs/ #创建命名空间 kubectl create namespace kubernetes-dashboard # 创建key文件 openssl genrsa -out dashboard.key 2048 #证书请求 openssl req -days 36000 -new -out dashboard.csr -key dashboard.key -subj '/CN=dashboard-cert' #自签证书 openssl x509 -req -in dashboard.csr -signkey dashboard.key -out dashboard.crt #创建kubernetes-dashboard-certs对象 kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kubernetes-dashboard
创建dashboard
kubectl create -f recommended.yaml
创建 管理员
vi dashboard-admin.yaml
apiVersion: v1 kind: ServiceAccount metadata: labels: k8s-app: kubernetes-dashboard name: dashboard-admin namespace: kubernetes-dashboard
#保存退出后执行 kubectl create -f dashboard-admin.yaml #为用户分配权限 vi dashboard-admin-bind-cluster-role.yaml
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: dashboard-admin-bind-cluster-role labels: k8s-app: kubernetes-dashboard roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: dashboard-admin namespace: kubernetes-dashboard
#保存退出后执行 kubectl create -f dashboard-admin-bind-cluster-role.yaml #查看并复制用户Token kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep dashboard-admin | awk '{print $1}')