The typical way is to map a triangular grid of the desired density over the faces of a Platonic solid (specifically an icosahedron if you want to use hexagons and pentagons). I describe mapping triangular grids onto icosahedra in this answer, and you can find more details here. This method lets you change the number and arrangement of tiles very flexibly, so you can make any of the three classes of geodesic:
Next, you project each vertex of the mapped grid onto an enclosing sphere. There are many ways to do this...
Gnomonic Projection is the easiest - just normalize the vector to get its projection onto the unit sphere. This leads to significant distortion however - hexagon tiles near the middle of each icosahedral face will be much larger than those near the pentagons at the corners.
Recursive subdivision is probably the most popular. Starting with one triangular face of the icosahedron, find the midpoint of each edge and project it gnomonically onto the sphere. Join these new points to split the original triangle into four smaller triangles. Now you can repeat the process on each of those four until you reach your desired density. This does a better job of spreading out the distortion than pure gnomonic, but there are only certain geodesic breakdowns it can achieve (most easily: Class-I with frequencies that are a power of two)
Snyder's equal-area projection, or similar projections, are common in geographic information systems. They reduce the distortion while still giving you flexibility to use any class of geodesic, but they tend to be complex to implement or, as in the link above, described in academic papers locked behind a paywall.
Buckminster Fuller developed a projection for his Dymaxion Map that also reduces distortion, but while it's easy to find a description of the method, equations to execute it also tend to sit behind a paywall.
Here's a good resource for these and other projection methods.
Once you have your points projected onto the sphere, each one becomes the center and normal for a face (this is performing the dual operation to get a Goldberg polyhedron). You can get the vertices of these faces by taking the three faces that surround each vertex and intersecting the planes defined by their positions/normals.