linux sed 替换多文件字符串
2021-01-30 tech linux sed 1 mins 92 字
sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir`
例如:
sed -i "s/n1/kelu-n1/g" `ls`
sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir`
例如:
sed -i "s/n1/kelu-n1/g" `ls`
kubesphere 是青云开源的 kubernetes 管理平台,可以纳管原生 的 Kubernetes。我个人挺喜欢他们的UI设计,从kubesphere 1.0 就关注了,当时无法在本地环境中安装,只能蹭了一波他们销售发放的优惠券在云上安装体验。近期又尝试在我本地纯净的kubernetes集群上安装 kubesphere 3.0,虽然仍然有一小番波折,不过总算是安装好了。这篇文章记录相关的要点。
我的 kubernetes 版本 v1.20.2,没有任何可用的外部存储,所能依靠的只有 local-storage。
节点可用资源:1c2g
安装默认storage class
创建 sc。
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
参考:存储类
配置为默认 sc
kubectl patch storageclass local-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
查看已经运行ok
kubectl get sc
跌跌撞撞一共起了6个 pv,如图:
分别用于redis、Prometheus、openldap,如果后期安装 service mesh(可选),还需要为 es 起 对应的pv。
以下的yaml文件注意修改亲和性相关的配置。
创建目录
mkdir -p /app/redis /app/prometheus1 /app/prometheus2 /app/openldap /app/es/data /app/es/data2
redis,10G
apiVersion: v1
kind: PersistentVolume
metadata:
name: redis-pv
spec:
capacity:
storage: 10Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: local-storage
local:
path: /app/redis
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- 10.184.0.131
Prometheus,20G
apiVersion: v1
kind: PersistentVolume
metadata:
name: prometheus-pv-1
spec:
capacity:
storage: 20Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: local-storage
local:
path: /app/prometheus1
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- 10.184.0.131
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: prometheus-pv-2
spec:
capacity:
storage: 20Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: local-storage
local:
path: /app/prometheus2
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- 10.184.0.131
openldap,10G
apiVersion: v1
kind: PersistentVolume
metadata:
name: prom2-pv
spec:
capacity:
storage: 10Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: local-storage
local:
path: /app/openldap
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- 10.184.0.133
service mesh/es,20G (可选)
apiVersion: v1
kind: PersistentVolume
metadata:
name: es-data-pv
spec:
capacity:
storage: 20Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: local-storage
local:
path: /app/es/data
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- 10.184.0.131
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: es-data2-pv
spec:
capacity:
storage: 20Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: local-storage
local:
path: /app/es/data2
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- 10.184.0.131
- 10.184.0.132
- 10.184.0.133
kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.0.0/kubesphere-installer.yaml
kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.0.0/cluster-configuration.yaml
等待20分钟左右。
kubectl get po --all-namespaces
可以通过命令行查看安装过程。初始只有一个Pod ks-installer,它在Pod中运行ansible,可以查看它的日志,如果有错误就针对性地解决错误:
kubectl logs -f -n kubesphere-system ks-installer-xxx
安装完成后日志应该如下:
至此已经可以使用了。我尝试了开启 service mesh,有三个pod一直无法启动。因为只是随手玩玩,就不深究了。kubesphere的service mesh还是老版本的istio,就是还处于分离状态的组件,不是1.5版本之后的单体istio。
开启办法参考文档:https://kubesphere.io/docs/pluggable-components/service-mesh/
页面左上角 平台管理->集群管理->自定义资源crd-> 搜索 clusterconfiguration -> 进入
拉到最后,将 service mesh 配置 enabled 改为 true,即可。
查看安装进度:
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f
无法登录,account not active
查阅了不少 github issue,基本的情况是openldap那个容器相关的存储或者网络有问题。我一开始没有挂pv,估计是这个原因导致的问题。
实际上挂上pv之后仍然不行。最后重启kubesphere 所有的pod之后可以登陆了。
service mesh 仍然有3个pod无法启动。
因为只是顺手在做,并不使用,先记录一下,目前没去理。
参考使用kubesphere的卸载脚本即可:
https://github.com/kubesphere/ks-installer/blob/release-3.1/scripts/kubesphere-delete.sh
helm 是 k8s 的一个包管理工具,可以简化k8s应用的部署和管理,可以理解为yum和或者apt等包管理工具。
18年的时候记录过相关的笔记,当时是还是v2版本,v3 版本有了重大变化,当时的文章已经不合适了,故而重新记录helm相关的安装和使用笔记。
wget https://get.helm.sh/helm-v3.2.1-linux-amd64.tar.gz
tar zxvf helm-v3.2.1-linux-amd64.tar.gz
mv ./linux-amd64/helm /usr/bin
helm repo add stable https://charts.helm.sh/stable
helm repo add incubator https://charts.helm.sh/incubator
helm repo update
早先使用的是这个源:
helm repo add stable https://kubernetes-charts.storage.googleapis.com/
添加的时候一直报错:
Error: looks like "https://kubernetes-charts.storage.googleapis.com" is not a valid chart repository or cannot be reached: failed to fetch https://kubernetes-charts.storage.googleapis.com/index.yaml : 403 Forbidden
原来是2020.11.13 后改了这个地址了。
以安装kubefed为例:
添加源
$ helm repo add kubefed-charts https://raw.githubusercontent.com/kubernetes-sigs/kubefed/master/charts
$ helm repo update
搜索
$ helm search repo kubefed
NAME CHART VERSION APP VERSION DESCRIPTION
kubefed-charts/kubefed 0.6.1 KubeFed helm chart
安装
$ helm --namespace kube-federation-system upgrade -i kubefed kubefed-charts/kubefed --version=0.6.1 --create-namespace
Release "kubefed" does not exist. Installing it now.
NAME: kubefed
LAST DEPLOYED: Wed Aug 5 16:03:46 2020
NAMESPACE: kube-federation-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
下载到本地
helm pull kubefed-charts/kubefed
find . -type d -print0 | xargs -0 chmod 0755
find . -type f -print0 | xargs -0 chmod 0644
作为kubernetes相关的开发人员,以前我都是用 kind 拉起集群,再进行相关开发的。但kind 毕竟只是一个模拟工具,没法满足我们对 kubernetes 更底层的开发。我使用了 ansible 和 vagrant 进行模拟部署,这篇文章进行一个简要记录。
vagrant 相关的操作可以参考我先前的文章——《vagrant 快速上手(基于Debian9)》
以下是我的 Vagrantfile,我将其置于 /etc/vagrant
设置了3个虚机n1 n2 n3,内存cpu可以随意配置,推荐最小1c1g。
运行:
vagrant up
ssh的相关配置如下:
记住上边的信息,在ansible的配置里,需要使用它们来与虚机通信。
虚机运行情况如下:
参考我先前的文章——《ansible 快速上手(Debian 9)》
kubeaze 是个 基于 ansible 快速搭建 kubernetes 的项目。可以免翻墙安装,省去了国内开发者很多麻烦, GitHub 上截至2021.01是 6.5k 个赞,是个非常受欢迎的项目了。
我用它来进行kubernetes的安装。基于最简单的架构,我配置了2个master,1个node。
下载easzup
chmod +x ./easzup
# 下载kubernetes 镜像
./easzup -D
运行后, /etc/ansible
目录下就下载好了所有相关的文件了。
如果还没有安装 ansible,按照 boot.sh 的命令安装。
配置虚机信息
cp example/hosts.multi-node hosts
hosts 文件 用来描述 虚机和kubernetes的相关信息,可以根据 vagrant 相关的配置和个人需要修改 hosts 文件。
我的 hosts 文件如下:
10.184.0.131 ansible_ssh_host=127.0.0.1 ansible_ssh_port=2200 ansible_ssh_private_key_file=/etc/vagrant/.vagrant/machines/n1/virtualbox/private_key
10.184.0.132 ansible_ssh_host=127.0.0.1 ansible_ssh_port=2201 ansible_ssh_private_key_file=/etc/vagrant/.vagrant/machines/n2/virtualbox/private_key
10.184.0.133 ansible_ssh_host=127.0.0.1 ansible_ssh_port=2202 ansible_ssh_private_key_file=/etc/vagrant/.vagrant/machines/n3/virtualbox/private_key
[local]
test
# 'etcd' cluster should have odd member(s) (1,3,5,...)
# variable 'NODE_NAME' is the distinct name of a member in 'etcd' cluster
[etcd]
10.184.0.131 NODE_NAME=etcd1
10.184.0.132 NODE_NAME=etcd2
10.184.0.133 NODE_NAME=etcd3
# master node(s)
[kube-master]
10.184.0.131
10.184.0.132
# work node(s)
[kube-node]
10.184.0.133
# [optional] harbor server, a private docker registry
# 'NEW_INSTALL': 'yes' to install a harbor server; 'no' to integrate with existed one
# 'SELF_SIGNED_CERT': 'no' you need put files of certificates named harbor.pem and harbor-key.pem in directory 'down'
[harbor]
#192.168.1.8 HARBOR_DOMAIN="harbor.yourdomain.com" NEW_INSTALL=no SELF_SIGNED_CERT=yes
# [optional] loadbalance for accessing k8s from outside
[ex-lb]
#192.168.1.6 LB_ROLE=backup EX_APISERVER_VIP=10.184.0.13250 EX_APISERVER_PORT=8443
#192.168.1.7 LB_ROLE=master EX_APISERVER_VIP=10.184.0.13250 EX_APISERVER_PORT=8443
# [optional] ntp server for the cluster
[chrony]
#10.184.0.131
[all:vars]
# --------- Main Variables ---------------
# Cluster container-runtime supported: docker, containerd
CONTAINER_RUNTIME="docker"
# Network plugins supported: calico, flannel, kube-router, cilium, kube-ovn
CLUSTER_NETWORK="calico"
# Service proxy mode of kube-proxy: 'iptables' or 'ipvs'
PROXY_MODE="iptables"
# K8S Service CIDR, not overlap with node(host) networking
SERVICE_CIDR="10.68.0.0/16"
# Cluster CIDR (Pod CIDR), not overlap with node(host) networking
CLUSTER_CIDR="172.20.0.0/16"
# NodePort Range
NODE_PORT_RANGE="20000-40000"
# Cluster DNS Domain
CLUSTER_DNS_DOMAIN="cluster.local."
# -------- Additional Variables (don't change the default value right now) ---
# Binaries Directory
bin_dir="/opt/kube/bin"
# CA and other components cert/key Directory
ca_dir="/etc/kubernetes/ssl"
# Deploy Directory (kubeasz workspace)
base_dir="/etc/ansible"
# Calico
#
IP_AUTODETECTION_METHOD: "interface=enp0s8"
ssh的配置信息,在 vagrant 目录下 运行命令
vagrant ssh-config
可以获得。
修改网络插件相关配置。
由于我是用的是 calico,在 hosts 文件中修改了下面几个配置:
如果不配置 IP_AUTODETECTION_METHOD,默认是 can-reach xxx
,很有可能导致集群无法互联。 vagrant 内网卡名为 enp0s8
.
修改 ansible.cfg 配置文件
增加下面的配置,使用 vagrant 用户。
remote_user = vagrant
修改以下ansible的yaml文件,增加become: true
配置
这么修改的原因是,如果不使用 become: true
,apt 更新等很多需要root权限的操作将报错,使得流程不能继续下去。
修改大致如下。
运行。
cd /etc/vagrant
ansible-playbook 01.prepare.yml
ansible-playbook 02.etcd.yml
ansible-playbook 03.docker.yml
ansible-playbook 04.kube-master.yml
ansible-playbook 05.kube-node.yml
ansible-playbook 06.network.yml
ansible-playbook 07.cluster-addon.yml
测试
kubectl get nodes
wget cdn.kelu.org/blog/2021/01/demo.yaml
kubectl apply -f demo.yaml
查看本机上能否访问以下地址:
只要能访问就说明网络是ok的。