01kubeadm 安装 k8s

环境:
    master:10.4.7.230
    node01:10.4.7.240
    node02:10.4.7.241
OS:CentOS 7.8
配置:master 2核,3G
     node01  node02 2核,4G
k8s 版本 1.22.0
一、基础设置:[所有节点上面都要操作]
关闭 firewall-cmd selinux
hosts文件,各个节点,要添加


关闭swap分区:
swapoff -a #临时关闭
vi /etc/fstab ##永久关闭
禁用 swap分区的挂载

将桥接的IPV4流量传递到iptables 的链
#防止ipv4的一些流量,不能被iptables给拦截,
官方建议是启用,防止丢包,不启用的话,网络会有一些小的问题
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 ntpdate -y
ntpdate time.windows.com
##涉及到 证书,至少要求 集群内的时间是一样的
二、安装docker [所有节点上都要安装]

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum install docker-ce -y
systemctl enable docker
systemctl start docker

    ## 配置镜像下载加速器:[所有节点都要配置]

cat > /etc/docker/daemon.json << EOF
{

"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

## "exec-opts": ["native.cgroupdriver=systemd"] 这一行不加的话,后面初始化master时会报错



重启docker:
systemctl restart docker
docker info ##查看docker 信息
三、安装 Kubeadm ,kubelet 和 kubectl [所有节点都要安装]
    添加 阿里云 yum源
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
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
########***********
kubeadm 不单纯是简化部署k8s集群,而是采用了容器化方式部署 k8s组件
(kubeadm 会自动 部署 kube-apiserver scheduler controller-manager etcd kube-proxy)
master : kube-apiserver scheduler controller-manager etcd
node: kubelet(非容器化) kube-proxy
#########**********
##由于 k8s版本更新频繁,(每三个月更新一个版本)

## 这里指定版本号部署:
yum install kubelet-1.22.0 kubeadm-1.22.0 kubectl-1.22.0 -y

### 安装好后,不要启动 kubelet ,你也启动不了,因为kubelet需要配置文件,kubadm会生成这个配置文件,kubeadm 会自动帮我们启动这个 kubelet ,我们只需要设置一个,开机启动 kubelet 就可以了

systemctl enable kubelet
四、### 部署Kubernetes Master 在 master 节点上进行 部署
在10.4.7.230(Master)执行。
kubeadm init \
 --apiserver-advertise-address=10.4.7.230 \
 --image-repository registry.aliyuncs.com/google_containers \
 --kubernetes-version v1.22.0 \
 --service-cidr=10.96.0.0/16 \
 --pod-network-cidr=10.244.0.0/16 \
 --ignore-preflight-errors=all

##参数说明:
--apiserver-advertise-address 集群通告地址
 --image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
 --kubernetes-version K8s版本,与上面安装的一致
 --service-cidr 集群内部虚拟网络,Pod统一访问入口
 --pod-network-cidr Pod网络,,与下面部署的CNI网络组件yaml中保持一致

###############如果安装报错:
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp [::1]:10248: connect: connection refused.
docker的cgroup驱动程序默认设置为system。默认情况下Kubernetes cgroup为systemd,我们需要更改Docker cgroup驱动

解决方法:
kubeadm reset
vim /etc/docker/daemon.json
{
 "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}

systemctl daemon-reload
systemctl restart docker
即可重新初始化即可成功。
################
### kubeadm init 初始化工作:经历了那些步骤

第一步,[preflight] 环境检查和拉取镜像 kubeadm config images pull
第二步,[certs] 生成k8s证书和 etcd 证书,证书目录,/etc/kubernetes/pki
第三步,[kubeconfig] 生成kubeconfig文件,这个文件主要用来 认证, 判断你有没有权限来连接我
第四步,[kubelet-start] 生成 kubelet的配置文件,/var/lib/kubelet/config.yaml  启动kubelet
第五步,[control-plane] 部署管理节点组件,用镜像启动容器。kubectl get pods -n kube-system
第六步,[etcd] 部署etcd 数据库,用镜像启动容器
第七步,[upload-config] [kubelet] [upload-certs]上传配置文件到k8s中,
第八步,[mark-control-plane] 给管理节点添加一个标签,[node-role.kubernetes.io/master(deprecated) node-role.kubernetes.io/control-plane node.kubernetes.io/exclude-from-external-load-balancers],再添加一个污点 [node-role.kubernetes.io/master:NoSchedule],添加污点的作用,让新创建的容器,不要分配在我这个节点上。
第九步,[bootstrap-token] 自动为kubelet 颁发 证书
第十步,部署了相关插件,coreDNS 为k8s 内部提供DNS解析 , kube-proxy
最后,拷贝连接 k8s集群的认证文件到默认路径下

mkdir -p $HOME/.kube
 sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
 sudo chown $(id -u):$(id -g) $HOME/.kube/config
############################## 初始化成功提示:



拷贝kubectl使用的连接k8s认证文件到默认路径:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

查看工作节点:
kubectl get nodes
注:由于网络插件还没有部署,状态显示,还没有准备就绪 NotReady

####@@@@@@
五、加入Kubernetes Node,在另外两个node上面执行

在其他node 节点 上执行 如下命令,添加节点
kubeadm join 10.4.7.230:6443 --token kw424w.r1j35e41ck7v3mpg \
--discovery-token-ca-cert-hash sha256:cfe29be7b54e63e8dc1a7bbe593d5c2ec97cd1711f3ef5411939d6a26da42f95



#########
默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,可以直接使用命令快捷生成:
kubeadm token create --print-join-command
参考资料:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-join/
注:由于网络插件还没有部署,还没有准备就绪 NotReady

六、部署容器网络(CNI),安装calico 【master 节点上安装】
Calico是一个纯三层的数据中心网络方案,是目前Kubernetes主流的网络方案。
下载yaml文件:
wget --no-check-certificate https://docs.projectcalico.org/manifests/calico.yaml

在解析主机 raw.githubusercontent.com (raw.githubusercontent.com)... 0.0.0.0, ::
正在连接 raw.githubusercontent.com (raw.githubusercontent.com)|0.0.0.0|:443... 失败:拒绝连接。
正在连接 raw.githubusercontent.com (raw.githubusercontent.com)|::|:443... 失败:拒绝连接。
下载不了,是网络的问题,可以直接在浏览器中下载。
上传已下载好的 calico.yaml 到master

vim calico.yaml
下载完后还需要修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init的 --pod-network-cidr指定的一样。


修改完后文件后,保存退出。
开始部署:
kubectl apply -f calico.yaml
kubectl get pods -n kube-system
##查看pod,在kube-system名称空间中,kubeadm以容器化方式部署的k8s插件的pod都是在kube-system名称空间中
等Calico Pod都Running,节点也会准备就绪:
下载镜像会比较慢一点,
参考资料:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#pod-network


kubectl get pods -n kube-system






这时,再查看 节点状态:


七. 测试kubernetes集群

在Kubernetes集群中创建一个pod,验证是否正常运行:
master 节点上运行:
kubectl create deployment nginx --image=nginx
## 第一个nginx 是 deployment 名称,后面nginx 是使用的镜像


deployment 可以简写成 deploy
Deploymentk8s用来管理部署无状态Pod的控制器。
默认创建的pod 在 default 名称空间,kubectl get pods ## 默认查看的是 default 名称空间


此时这个deployment里的nginx pod还无法对外界提供服务。
我们创建一个service让外界能够消费。使用命令行创建这样的一个service:
kubectl expose deployment nginx --port=80 --type=NodePort


kubectl get pod,svc


kubectl get pods -o wide


访问地址:http://NodeIP:Port



八、部署Dashboard 【master节点上操作】
Dashboard是官方提供的一个UI,可用于基本管理K8s资源。
下载dashboard的yaml 文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml

下载失败的解决办法:
浏览器打开 https://www.ipaddress.com/ 







在 master 节点上,hosts文件中,添加一条 主机记录【108.133测试不行】


再次重新下载。
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml
默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:

vi recommended.yaml


应用这个recommended.yaml文件
kubectl apply -f recommended.yaml


执行成功后,稍等一会,进行查看 pod
 kubectl get pods -n kubernetes-dashboard


kubectl get pods,svc -n kubernetes-dashboard


访问地址:https://NodeIP:30065






输入的时候,可以包括引号,也可以不输入引号,没有空格,而且不会显示。



此处,我们选择,Token登录

创建Token
创建service account并绑定默认cluster-admin管理员集群角色:
# 创建用户
kubectl create serviceaccount dashboard-admin -n kube-system


# 用户授权
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin



##查看 创建的Token
kubectl get secret -n kube-system |grep dashboard



# 获取用户Token
kubectl describe secret dashboard-admin-token-pk54c -n kube-system



kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
此命令 和 上面 一条命令,功能都一样,都是查看Token
###使用输出的token登录Dashboard。