Faits :
A.
Par jugement du 26 novembre 2019, le Tribunal pénal de l'arrondissement de la Sarine a reconnu A._ coupable de crime, délit et contravention à la loi fédérale sur les stupéfiants (LStup) et l'a condamné à une peine privative de liberté de 18 mois, dont neuf mois ferme et neuf mois avec sursis pendant trois ans, ainsi qu'au paiement d'une amende contraventionnelle de 1'000 francs. Il a également prononcé l'expulsion judiciaire obligatoire du territoire suisse de A._ pour une durée de cinq ans.
B.
Par arrêt du 25 novembre 2020, la Cour d'appel pénal du Tribunal cantonal fribourgeois a partiellement admis l'appel de A._ et l'appel joint formé par le ministère public. Elle l'a réformé en ce sens que A._ est reconnu coupable de crime et de contravention à la LStup et condamné à une peine privative de liberté de 22 mois avec sursis pendant trois ans. Elle a confirmé le jugement pour le surplus.
En substance, la cour cantonale a retenu les faits suivants:
B.a. Entre la mi-août 2018 et le 14 janvier 2019, A._ a acheté une quantité indéterminée de cocaïne, dont il a revendu une quantité minimale de 112 grammes brut (vente de 100 grammes de cocaïne à B._, de 10 grammes à C._ et de 2 grammes à D._).
A._ a en outre remis gratuitement une quantité indéterminée de cocaïne à des tiers, notamment à D._.
B.b. Entre le mois de novembre 2017 et le 14 janvier 2019, A._ a acheté une quantité indéterminée de haschich, dont il a revendu une quantité minimale de 312 grammes à E._, pour un montant total de 6'240 francs.
A._ a en outre remis gratuitement une quantité indéterminée de haschich à des tiers, notamment à F._, sous la forme de joints.
B.c. Entre le mois de juillet 2018 et le mois de janvier 2019, A._ a acheté une quantité indéterminée de marijuana, dont il a revendu une quantité minimale de 80 grammes à F._, pour un montant total de 800 francs.
B.d. A._ a consommé occasionnellement de la cocaïne, depuis l'âge de 25 ou 26 ans, soit depuis 2013 ou 2014. Il est également consommateur régulier de haschich depuis l'âge de 24 ans, soit depuis 2012, à raison d'un à quatre joints par jour, ainsi que de marijuana. Le 12 janvier 2019, il a obtenu gratuitement un comprimé d'ecstasy, en échange d'une ligne de cocaïne.
C.
A._ forme un recours en matière pénale au Tribunal fédéral contre l'arrêt du 25 novembre 2020. Il conclut, avec suite de frais et dépens, principalement à sa réforme en ce sens qu'il est acquitté du chef de prévention de crime contre la LStup et condamné pour délit et contravention à la LStup à une peine de huit mois avec sursis pendant trois ans. Il conclut à l'octroi d'une indemnité au sens de l'<ref-law> d'un montant de 14'600 fr. et d'une indemnité au sens de l'<ref-law>. Subsidiairement, il conclut à l'annulation de l'arrêt du 25 novembre 2020 et au renvoi de la cause à la cour cantonale pour nouvelle décision dans le sens des considérants. En outre, il sollicite l'octroi de l'effet suspensif.
D.
Invités à se déterminer sur le recours, le ministère public a conclu à son rejet dans la mesure de sa recevabilité et la cour cantonale a renoncé à formuler des observations.

Considérant en droit :
1.
Le recourant reproche d'abord à la cour cantonale d'avoir retenu qu'il avait vendu 2 grammes brut de cocaïne à D._ en se basant sur les déclarations de celle-ci. Il conteste l'exploitabilité de ces déclarations, en se plaignant notamment d'une violation de son droit à la confrontation et du droit à un procès équitable.
1.1. L'art. 6 par. 3 let. d CEDH garantit à tout accusé le droit d'interroger ou de faire interroger les témoins à charge et d'obtenir la convocation et l'interrogation des témoins à décharge dans les mêmes conditions que les témoins à charge. Cette disposition exclut qu'un jugement pénal soit fondé sur les déclarations de témoins sans qu'une occasion appropriée et suffisante soit au moins une fois offerte au prévenu de mettre ces témoignages en doute et d'interroger les témoins, à quelque stade de la procédure que ce soit (<ref-ruling> consid. 1.3 p. 176; <ref-ruling> consid. 3.1 p. 41; <ref-ruling> consid. 2.2 p. 480 s.; arrêts 6B_1028/2020 du 1er avril 2021 consid. 1.2.1 et 6B_383/2019 du 8 novembre 2019 consid. 8.1.2 non publié aux <ref-ruling>). En tant qu'elle concrétise le droit d'être entendu (art. 29 al. 2 Cst.), cette exigence est également garantie par l'art. 32 al. 2 Cst. (<ref-ruling> consid. 3.1.2 p. 435; <ref-ruling> consid. 2.2 p. 480). Ce droit est absolu lorsque la déposition du témoin en cause est d'une importance décisive, notamment lorsqu'il est le seul témoin ou que sa déposition constitue une preuve essentielle (ATF <ref-ruling> consid. 2.2 p. 480 s. et les références citées; arrêt 6B_721/2020 du 11 février 2021 consid. 3.3.1).
Dans certains cas, la déclaration d'un témoin auquel le prévenu n'a pas été confronté peut être exploitée, pour autant que la déposition soit soumise à un examen attentif, que l'accusé puisse prendre position à son sujet et que le verdict de culpabilité ne soit pas fondé sur cette seule preuve (ATF <ref-ruling> consid. 2.2 p. 480 ss et les références citées; arrêts 6B_721/2020 du 11 février 2021 consid. 3.3.1; 6B_289/2020 du 1er décembre 2020 consid. 4.5.1). De manière générale, il convient de rechercher si la procédure, considérée dans son ensemble, y compris la présentation des moyens de preuve, a revêtu un caractère équitable. La question de savoir si le droit d'interroger ou de faire interroger les témoins à charge garanti par l'art. 6 par. 3 let. d CEDH a été respecté doit donc être examinée dans chaque cas en fonction de l'ensemble de la procédure et des circonstances concrètes (arrêts 6B_721/2020 précité consid. 3.3.1; 6B_289/2020 précité consid. 4.5.1).
1.2. Aux termes de l'<ref-law>, les parties ont le droit d'assister à l'administration des preuves par le ministère public et les tribunaux et de poser des questions aux comparants. La présence des défenseurs lors des interrogatoires de police est régie par l'<ref-law>. Selon l'<ref-law>, une partie ou son conseil juridique peuvent demander que l'administration des preuves soit répétée lorsque, pour des motifs impérieux, le conseil juridique ou la partie non représentée n'a pas pu y prendre part. Il peut être renoncé à cette répétition lorsqu'elle entraînerait des frais et démarches disproportionnés et que le droit des parties d'être entendues, en particulier celui de poser des questions aux comparants, peut être satisfait d'une autre manière. Selon l'<ref-law>, les preuves administrées en violation de l'<ref-law> ne sont pas exploitables à la charge de la partie qui n'était pas présente.
Selon la jurisprudence, le prévenu a en principe le droit de participer à l'audition de ses coprévenus, une violation dudit droit rendant inexploitables les déclarations faites à sa charge (cf. <ref-ruling> consid. 1.6.1 p. 459). Le droit de participer à l'administration des preuves suppose toutefois la qualité de partie. Le prévenu ne peut par conséquent participer à l'audition de coaccusés que si ces personnes sont accusées dans la même procédure que lui. Le droit du prévenu de participer à l'administration des preuves selon l'<ref-law> ne s'étend donc pas aux procédures conduites séparément contre d'autres prévenus (<ref-ruling> consid. 1.2.3 p. 176). Il faut cependant tenir compte du droit de confrontation lorsque les autorités de poursuite pénale se fondent sur les déclarations d'un prévenu ressortant d'une procédure conduite séparément dans la mesure où celles-ci ne peuvent être utilisées que si le prévenu a au moins eu une fois la possibilité de mettre en doute les déclarations à sa charge et de poser des questions au prévenu contre lequel la procédure séparée est menée (<ref-ruling> consid. 4.5; <ref-ruling> consid. 1.3 p. 176; arrêt 6B_1028/2020 du 1er avril 2021 consid. 1.2.2).
1.3. La partie ou son conseil juridique peut renoncer à participer à l'administration d'une preuve (ATF <ref-ruling> consid. 2.2 p. 481; arrêts 6B_383/2019 du 8 novembre 2019 consid. 8.1.2 non publié in <ref-ruling>; 6B_1266/2018 du 12 mars 2019 consid. 1.7.1 et les références citées). La preuve qui n'a pas été administrée en présence de la partie ou de son conseil juridique pourra être utilisée à son encontre lorsqu'aucune requête tendant à une confrontation n'a été déposée en temps utile (cf. notamment <ref-ruling> consid. 3.3.1; JdT 2018 IV p. 155). Le prévenu doit requérir la confrontation et son silence à cet égard permet de déduire qu'il y a renoncé (arrêts 6B_383/2019 précité consid. 8.1.2; 6B_1266/2018 précité consid. 1.7.1 et les références citées). Le prévenu peut valablement renoncer à son droit à la confrontation, même de manière tacite, pour autant que la renonciation ne contredise pas un intérêt général important, qu'elle soit établie de manière exempte d'équivoque et qu'elle soit entourée d'un minimum de garanties correspondant à sa gravité (<ref-ruling> consid. 9.2 p. 49; arrêts 6B_238/2020 du 14 décembre 2020 consid. 3.1; 6B_383/2019 précité consid. 8.1.2). Il n'en reste pas moins qu'il incombe aux autorités de poursuite pénale de mettre en oeuvre une confrontation. Il ne peut ainsi être reproché au prévenu de requérir une telle confrontation au stade de l'appel seulement (arrêts 6B_383/2019 précité consid. 8.1.2; 6B_956/2016 du 19 juillet 2017 consid. 2.3.2 et la référence citée).
1.4. En l'espèce, contrairement à ce que soutient le recourant, pour retenir qu'il avait vendu 2 grammes de cocaïne à D._, la cour cantonale ne s'est pas fondée exclusivement sur les déclarations de la prénommée, mais aussi sur les déclarations du recourant lui-même. En effet, lors de son audition du 10 mai 2019, celui-ci a expressément reconnu qu'il avait acheté de la cocaïne pour le compte de D._ pour une quantité bien supérieure à 2 grammes (cf. pièces 2014 ss du dossier cantonal).
En outre, comme le relève le recourant, dès lors que D._ a été auditionnée en tant que prévenue dans le cadre d'une procédure pénale conduite séparément, il ne peut pas se prévaloir d'une violation de l'<ref-law> du fait qu'il n'a pas assisté à son audition (cf. supra consid. 1.2; <ref-ruling> consid. 4.5, JdT 2016 IV p. 79, 88). Si le recourant avait certes le droit d'être confronté à l'intéressée au moins une fois durant la procédure (cf. <ref-ruling> consid. 4.5 p. 230), il ne ressort cependant pas du jugement attaqué qu'il aurait requis une confrontation avec D._ en première instance ou devant l'instance d'appel, ni à un quelconque autre moment de la procédure, étant au demeurant précisé que, dans sa déclaration d'appel, il a expressément indiqué que de nouvelles preuves n'étaient pas requises, se contentant de soutenir que les déclarations de la prénommée étaient inexploitables. Le recourant ne prétend d'ailleurs pas avoir requis une telle confrontation.
Dans ces circonstances, la cour cantonale n'a pas violé le droit en retenant que le recourant avait renoncé à cette confrontation, de sorte que les déclarations faites par D._ étaient exploitables (cf. arrêts 6B_1266/2018 du 12 mars 2019 consid. 1.7.2 et 6B_710/2014 du 23 novembre 2015 consid. 2.2). Le grief du recourant est rejeté.
2.
Le recourant reproche ensuite à la cour cantonale d'avoir retenu qu'il avait vendu une quantité de 10 grammes de cocaïne à C._ sur la base des déclarations de ce dernier à la police du 7 février 2019, alors qu'il n'a pas eu l'occasion de participer à cette audition et que lesdites déclarations n'auraient pas été confirmées devant le ministère public.
2.1. Comme déjà mentionné (supra consid. 1.2), l'art. 147 al. 1, 1ère phrase, CPP consacre le principe de l'administration des preuves en présence des parties durant la procédure d'instruction et les débats. Il en ressort que les parties ont le droit d'assister à l'administration des preuves par le ministère public et les tribunaux et de poser des questions aux comparants. Ce droit spécifique de participer et de collaborer découle du droit d'être entendu (<ref-law>). Il ne peut être restreint qu'aux conditions prévues par la loi (cf. art. 108, 146 al. 4 et 149 al. 2 let. b CPP; cf. aussi <ref-law>; <ref-ruling> consid. 3.3.1; arrêts 6B_1080/2020 du 10 juin 2021 consid. 5.1; 6B_1385/2019 du 27 février 2020 consid. 1.1). Les preuves administrées en violation de l'<ref-law> ne sont pas exploitables à la charge de la partie qui n'était pas présente (<ref-law>; cf. ATF 43 IV 397 consid. 3.3.1; <ref-ruling> consid. 1.6.1 p. 459; <ref-ruling> consid. 1.2.1 p. 175; arrêt 6B_1385/2019 précité consid. 1.1).
2.2. Avant l'ouverture d'une instruction, le droit de participer à l'administration des preuves ne s'applique en principe pas (<ref-law> a contrario). Aux termes de l'<ref-law>, le ministère public ouvre une instruction, notamment, lorsqu'il ressort du rapport de police, des dénonciations ou de ses propres constatations des soupçons suffisants laissant présumer qu'une infraction a été commise (let. a) ou s'il ordonne des mesures de contrainte (let. b). L'instruction pénale est considérée comme ouverte dès que le ministère public commence à s'occuper de l'affaire. Cela est en tout cas le cas lorsque le ministère public ordonne des mesures de contrainte. Dès lors qu'un mandat de comparution est une mesure de contrainte, celui-ci suffit en règle générale à l'ouverture de l'instruction lorsque le ministère public effectue lui-même les premières mesures d'instruction, en particulier entend le prévenu. L'ordonnance d'ouverture d'instruction n'a qu'un effet déclaratoire (cf. <ref-ruling> consid. 3.4.2; JdT 2018 IV 155; <ref-ruling> consid. 1.1.4; JdT 2015 IV 191; arrêts 6B_1080/2020 du 10 juin 2021 consid. 5.3; 6B_1385/2019 du 27 février 2020 consid. 1.1).
2.3. Lorsque la police procède à des interrogatoires sur mandat du ministère public, les parties à la procédure jouissent des droits accordés dans le cadre des auditions effectuées par le ministère public (<ref-law>; <ref-ruling> consid. 4.3; JdT 2013 IV p. 226; arrêt 6B_1080/2020 du 10 juin 2021 consid. 5.5). Il en résulte que les parties ont le droit d'être présentes et de poser des questions lors d'auditions menées par la police en raison d'un mandat conféré par le ministère public après l'ouverture de l'instruction (<ref-ruling> consid. 3.3.2 et les arrêts cités; arrêt 6B_1080/2020 précité consid. 5.5 et les références citées).
Le déroulement d'une audition sans la participation du prévenu n'exclut en principe pas la répétition de l'acte d'instruction. Toutefois, si l'audition est répétée ou si une audition de confrontation est menée ultérieurement, l'autorité pénale ne peut pas avoir recours aux résultats des auditions précédentes si celles-ci font l'objet d'une interdiction d'utiliser les preuves (<ref-ruling> consid. 1.6.2; arrêts 6B_14/2021 du 28 juillet 2021 consid. 1.3.3; 6B_1080/2020 précité consid. 5.5).
2.4. Les déclarations faites lors d'une première audience en violation de l'<ref-law> demeurent inutilisables conformément à l'<ref-law> lorsque la personne interrogée ne s'exprime pas librement et sans influence sur la cause dans le cadre d'une confrontation ultérieure (voir <ref-ruling> consid. 1.6 p. 459 et s.; arrêts 6B_14/2021 du 28 juillet 2021 consid. 1.3.4; 6B_1003/2020 précité consid. 2.2; 6B_1385/2019 du 27 février 2020 consid. 1.1; 6B_321/2017 du 8 mars 2018 consid. 1.5.2 publié in SJ 2018 I 356). Il ne suffit donc pas que la personne interrogée se limite à simplement confirmer ses déclarations antérieures. Si des déclarations faites lors d'auditions conduites en violation du droit de participer en vertu de l'<ref-law> sont textuellement présentées aux personnes interrogées lors d'auditions de confrontation ultérieures, ces déclarations sont utilisées de manière inadmissible au sens de l'<ref-law> (<ref-ruling> consid. 1.6.1 p. 459; cf. arrêts 6B_1080/2020 du 10 juin 2021 consid. 6.1; 6B_386/2020 du 14 août 2020 consid. 3.5.7; 6B_1385/2019 précité consid. 1.1; 6B_1133/2019 du 18 décembre 2019 consid. 1.3.2; voir aussi: ALEXANDRE GUISAN, La violation du droit de participer (<ref-law>), in AJP 3/2019, p. 346-348).
2.5. En l'espèce, le recourant a été entendu en qualité de prévenu par le ministère public, en présence de son défenseur, le 15 janvier 2019 (cf. pièces 3000 ss du dossier cantonal; <ref-law>). Dès cette date, il avait en principe le droit de participer à l'administration des preuves, sauf si cette participation était exclue pour des motifs résultant de la loi (cf. supra consid. 2.1 et 2.3; cf. aussi arrêt 6B_321/2017 du 8 mars 2018 consid. 1.5.2). Le recourant n'a cependant pas pu participer à l'audition de C._, entendu par la police sur délégation du ministère public en qualité de personne appelée à donner des renseignements le 7 février 2019. Lors de cette audition, le prénommé a déclaré avoir acheté, à Fribourg, une quantité d'environ 10 à 15 grammes de cocaïne au recourant (cf. pièces 2026 ss du dossier cantonal).
Le recourant a eu la possibilité d'assister à l'audition de C._ pour la première fois à l'occasion de l'audience de confrontation qui s'est tenue le 26 février 2019 devant le ministère public. Lors de cette audience, après relecture de ses déclarations du 7 février 2019, le témoin a répondu " oui ", à la question: " confirmez-vous vos déclarations? ". A ce stade, force est de constater que l'intéressé s'est limité à simplement confirmer ses déclarations antérieures faites en l'absence du recourant (cf. supra consid. 2.4). Par la suite, à la question: " maintenez-vous toujours votre version des faits? ", il a répondu: " j'ai dit à la Police que j'avais acheté 10-15 fois mais c'est parce que la Police m'avait mis la pression. Pour vous répondre, je pense que ce n'étai[t] pas 10-15 fois, je ne me rappelle pas " (cf. pièces 3007 ss du dossier cantonal; <ref-law>). La cour cantonale ne peut dès lors être suivie lorsqu'elle soutient que C._ aurait maintenu ses déclarations mais les aurait seulement nuancées. Il ressort en effet du procès-verbal que le prénommé n'a en tout cas pas confirmé ses déclarations quant à la quantité de cocaïne qu'il aurait achetée au recourant.
Compte tenu de ce qui précède, la cour cantonale a violé le droit fédéral en se fondant essentiellement sur les déclarations de C._ lors de son audition par la police - à laquelle le recourant n'a pas pu prendre part - pour l'établissement des faits alors que lesdites déclarations n'ont pas été confirmées lorsque le recourant a pu être confronté au prénommé. Le recours doit être admis sur ce point. Il incombera par conséquent à l'autorité cantonale de procéder à une nouvelle appréciation des preuves sans se fonder sur les déclarations faites par C._ le 7 février 2019 et qui n'auraient pas été confirmées lors d'une audition ultérieure.
3.
Le recourant conteste avoir vendu de la cocaïne à B._, en particulier la quantité retenue par la cour cantonale. Il se plaint, d'une part, d'une violation de la maxime d'accusation (cf. infra consid. 3.2 à 3.4) et, d'autre part, d'une appréciation arbitraire des preuves (cf. infra consid. 4).
3.1. Il ressort du jugement attaqué que B._ a indiqué, lors de ses auditions, que le recourant lui avait vendu de la cocaïne à partir de juillet 2018. Le prénommé a également indiqué qu'ils se contactaient par téléphone. La cour cantonale a retenu que, même s'il ressortait du contrôle téléphonique rétroactif effectué sur le numéro d'appel du recourant que le premier contact entre ce dernier et B._ remontait au 20 octobre 2018, ils pouvaient parfaitement se contacter, avec le même numéro de téléphone, mais par un autre système de communication, soit par des applications utilisant internet, qui ne peuvent être identifiées par ce moyen de contrôle. En se fondant notamment sur les déclarations du recourant, l'instance précédente a retenu que le recourant avait vendu 20 grammes par mois à B._ durant la période comprise entre mi-août 2018 et le 14 janvier 2019, soit un total de 100 grammes.
3.2. Le recourant reproche à la cour cantonale d'avoir violé la maxime d'accusation en retenant un nouveau " mode de procéder " qui ne ressortirait pas de l'acte d'accusation, ni des déclarations de B._.
3.3. L'<ref-law> consacre la maxime d'accusation. Selon cette disposition, une infraction ne peut faire l'objet d'un jugement que si le ministère public a déposé auprès du tribunal compétent un acte d'accusation dirigé contre une personne déterminée sur la base de faits précisément décrits. En effet, le prévenu doit connaître exactement les faits qui lui sont imputés et les peines et mesures auxquelles il est exposé, afin qu'il puisse s'expliquer et préparer efficacement sa défense (<ref-ruling> consid. 2.2 p. 65; <ref-ruling> consid. 3.4.1 p. 142 s.). Le tribunal est lié par l'état de fait décrit dans l'acte d'accusation (principe de l'immutabilité de l'acte d'accusation), mais peut s'écarter de l'appréciation juridique qu'en fait le ministère public (<ref-law>), à condition d'en informer les parties présentes et de les inviter à se prononcer (<ref-law>). Il peut également retenir dans son jugement des faits ou des circonstances complémentaires, lorsque ceux-ci sont secondaires et n'ont aucune influence sur l'appréciation juridique (arrêts 6B_892/2020 du 16 février 2021 consid. 8.1; 6B_1023/2017 du 25 avril 2018 consid. 1.1 non publié aux <ref-ruling>). Le principe de l'accusation est également déduit de l'art. 29 al. 2 Cst. (droit d'être entendu), de l'art. 32 al. 2 Cst. (droit d'être informé, dans les plus brefs délais et de manière détaillée, des accusations portées contre soi) et de l'art. 6 par. 3 let. a CEDH (droit d'être informé de la nature et de la cause de l'accusation arrêts 6B_1188/2020 du 7 juillet 2021 consid. 2.1; 6B_383/2019 du 8 novembre 2019 consid. 9.1 non publié aux ATF 147 IV 490).
Les <ref-law> règlent la mise en accusation, en particulier le contenu strict de l'acte d'accusation. Selon l'<ref-law>, l'acte d'accusation désigne notamment les actes reprochés au prévenu, le lieu, la date et l'heure de leur commission ainsi que leurs conséquences et le mode de procéder de l'auteur (let. f); les infractions réalisées et les dispositions légales applicables de l'avis du ministère public (let. g). En d'autres termes, l'acte d'accusation doit contenir les faits qui, de l'avis du ministère public, correspondent à tous les éléments constitutifs de l'infraction reprochée au prévenu (<ref-ruling> consid. 2.2 p. 65; arrêt 6B_623/2020 du 11 mars 2021 consid. 1.1) L'acte d'accusation définit l'objet du procès et sert également à informer le prévenu (fonction de délimitation et d'information) (<ref-ruling> consid. 2.2 p. 65; <ref-ruling> consid. 3.4.1 p. 142 s. et les références citées). Des imprécisions relatives au lieu ou à la date sont sans portée, dans la mesure où le prévenu ne peut pas avoir de doute sur le comportement qui lui est reproché (arrêt 6B_484/2020 du 21 janvier 2021 consid. 3.1 et les références citées).
3.4. En l'espèce, le fait que l'acte d'accusation ne mentionne pas expressément la manière dont le recourant et B._ se contactaient pour la vente de cocaïne ne suffit pas à admettre une violation de la maxime d'accusation, dès lors que, d'une part, cet élément n'a aucune incidence particulière sur la qualification des infractions ou l'appréciation juridique des faits et que, d'autre part, contrairement à ce que semble soutenir le recourant, cette absence n'a pas mis en péril les fonctions de délimitation et d'information de l'acte d'accusation. En effet, sur la base de l'acte d'accusation, le recourant ne pouvait pas douter du fait qu'il lui était notamment reproché d'avoir vendu environ 120 g de cocaïne à B._ entre novembre 2017 à janvier 2019 (cf. acte d'accusation, p. 1), soit également avant le 20 octobre 2018, en communiquant, le cas échéant, avec lui par divers systèmes de communication. Par ailleurs, contrairement à ce que semble penser le recourant, rien dans l'acte d'accusation n'indiquait que l'accusation "se basait exclusivement sur les déclarations de B._", ni que les intéressés se contactaient uniquement par téléphone.
Compte tenu de ce qui précède, la cour cantonale n'a pas violé la maxime d'accusation. Le grief du recourant est rejeté.
4.
Invoquant l'arbitraire dans l'établissement des faits et la violation du principe de présomption d'innocence, le recourant reproche à la cour cantonale d'avoir retenu qu'il aurait également communiqué avec B._ par un autre biais que par la carte SIM objet du contrôle téléphonique rétroactif. Il soutient également que la contradiction entre le résultat de ce contrôle et les déclarations du prénommé démontrerait que ces dernières ne seraient pas crédibles.
4.1. Le Tribunal fédéral n'est pas une autorité d'appel, auprès de laquelle les faits pourraient être rediscutés librement. Il est lié par les constatations de fait de la décision entreprise (<ref-law>), à moins qu'elles n'aient été établies en violation du droit ou de manière manifestement inexacte au sens des art. 97 al. 1 et 105 al. 2 LTF, à savoir, pour l'essentiel, de façon arbitraire au sens de l'art. 9 Cst. Une décision n'est pas arbitraire du seul fait qu'elle apparaît discutable ou même critiquable; il faut qu'elle soit manifestement insoutenable et cela non seulement dans sa motivation mais aussi dans son résultat (<ref-ruling> consid. 1.3.1; <ref-ruling> consid. 1.1 p. 155 s.; <ref-ruling> consid. 1.1 p. 503; sur la notion d'arbitraire v. <ref-ruling> consid. 2.3.1 p. 244). Le Tribunal fédéral n'entre en matière sur les moyens fondés sur la violation de droits fondamentaux, dont l'interdiction de l'arbitraire, que s'ils ont été invoqués et motivés de manière précise (<ref-law>; ATF <ref-ruling> consid. 1.1 p. 503). Les critiques de nature appellatoire sont irrecevables (<ref-ruling> consid. 1.3.1 p. 92; <ref-ruling> consid. 1.1 p. 156).
Lorsque l'appréciation des preuves et la constatation des faits sont critiquées en référence à la présomption d'innocence (art. 6 par. 2 CEDH, 32 al. 1 Cst. et 10 CPP), le principe in dubio pro reo n'a pas de portée plus large que l'interdiction de l'arbitraire (<ref-ruling> consid. 1.3.1 p. 92; <ref-ruling> consid. 1.1 p. 156; <ref-ruling> consid. 1.1 p. 503).
Lorsque l'autorité cantonale a forgé sa conviction quant aux faits sur la base d'un ensemble d'éléments ou d'indices convergents, il ne suffit pas que l'un ou l'autre de ceux-ci ou même chacun d'eux pris isolément soit à lui seul insuffisant. L'appréciation des preuves doit en effet être examinée dans son ensemble. Il n'y a ainsi pas d'arbitraire si l'état de fait retenu pouvait être déduit de manière soutenable du rapprochement de divers éléments ou indices. De même, il n'y a pas d'arbitraire du seul fait qu'un ou plusieurs arguments corroboratifs apparaissent fragiles, si la solution retenue peut être justifiée de façon soutenable par un ou plusieurs arguments de nature à emporter la conviction (arrêts 6B_1186/2020 du 1 juillet 2021 consid. 4.1; 6B_984/2020 du 4 mars 2021 consid. 1.1 et les références citées).
4.2. Le recourant ne saurait être suivi lorsqu'il soutient que c'est de manière arbitraire que la cour cantonale a retenu que, même si le contrôle téléphonique rétroactif effectué sur son téléphone avait fait ressortir un premier contact téléphonique entre lui-même et B._ au 20 octobre 2018, ceux-ci pouvaient parfaitement se contacter par un autre système de communication, soit par des applications utilisant internet. En effet, d'une part, contrairement à ce que soutient le recourant, B._ n'a pas déclaré qu'il avait " toujours " et uniquement contacté le recourant par téléphone pour lui acheter de la cocaïne. D'autre part, il ressort des faits de l'arrêt attaqué qui lient le Tribunal fédéral que des applications utilisant internet par lesquelles les intéressés ont pu se contacter ne peuvent pas être identifiées par ce moyen de contrôle. Enfin, il convient de relever que le recourant a lui-même reconnu qu'il communiquait avec B._ entre juillet et décembre 2018 par des applications utilisant internet comme Messenger (Facebook) (cf. pièces 5019 ss du dossier cantonal; <ref-law>). Il ressort également du jugement de première instance - auquel la cour cantonale renvoie dans son arrêt (cf. <ref-law>) - que le recourant communiquait aussi avec D._ via Facebook et avec d'autres clients pour la vente de haschich ou de marijuana via Messenger (cf. jugement de première instance, p. 12). Le grief du recourant est donc rejeté.
En outre, dès lors que c'est sans arbitraire que la cour cantonale a retenu que le recourant et B._ pouvaient parfaitement se contacter par un autre système de communication, on ne voit pas quelle " contradiction " entre les résultats du contrôle téléphonique rétroactif et les déclarations de B._ démontrerait que celles-ci ne seraient pas crédibles.
Enfin, contrairement à ce que soutient le recourant, le fait que la cour cantonale a retenu le début de la vente de cocaïne à B._ au mois d'août 2018 et non en juillet 2018 - comme indiqué par ce dernier -, en se fondant sur les déclarations du recourant lui-même, ne remet pas en cause la crédibilité des déclarations de B._, étant relevé que, dans ses déclarations, le prénommé avait déclaré " au mois de juillet sauf erreur " (pièce 2076 du dossier cantonal; <ref-law>) et que la version retenue par la cour cantonale est la plus favorable au recourant.
4.3. Pour le surplus, en tant que le recourant soutient que les déclarations de B._ ne sont pas crédibles et prétend que ce serait le prénommé qui lui vendait de la cocaïne et non l'inverse, il développe une argumentation appellatoire et, partant, irrecevable, par laquelle il oppose sa propre appréciation des preuves à celle de l'autorité précédente, sans démontrer en quoi celle-ci serait arbitraire (<ref-law>). Il en va ainsi lorsqu'il soutient que c'est à tort que la cour cantonale a retenu que B._ n'avait aucun intérêt à mentir. Il en va de même lorsqu'il prétend que la raison pour laquelle aucun stupéfiant ni matériel destiné au conditionnement de la drogue n'a été retrouvé au domicile de l'intéressé serait que ce dernier aurait eu " largement le temps de se débarrasser de tout élément incriminant " ou qu'il aurait " stocké sa marchandise à un autre endroit ". Par ailleurs, on ne saurait reprocher à la cour cantonale d'être tombée dans l'arbitraire en ne retenant pas que le fait que certaines personnes interrogées n'avaient pas confirmé que le recourant leur vendait de la cocaïne démontrerait que les déclarations de B._ n'étaient pas crédibles, étant au demeurant rappelé qu'il est établi que le recourant a également vendu de la cocaïne à D._ (supra consid. 1).
5.
Le recourant conteste sa condamnation pour infraction grave à la LStup (<ref-law>) en se fondant uniquement sur son " absence totale de trafic de cocaïne ". Dans cette mesure, son argumentation est irrecevable, étant relevé que, même en ne retenant que la vente de cocaïne à D._ et B._, la quantité dépasse largement la limite de 18 grammes fixée par la jurisprudence pour retenir le cas grave (cf. <ref-ruling> consid. 2.1.1 p. 315 s; <ref-ruling> consid. 3.2 p. 103; <ref-ruling> consid. 3b p. 145; arrêt 6B_894/2020 du 26 novembre 2020 consid. 1.1).
6.
Le recourant critique son expulsion du territoire suisse. Il reproche à la cour cantonale d'avoir violé l'art. 66a al. 1 let. o CP.
6.1. Aux termes de l'art. 66a al. 1 let. o CP, le juge expulse de Suisse l'étranger qui est condamné pour infraction grave à la loi fédérale sur les stupéfiants (<ref-law>), quelle que soit la quotité de la peine prononcée à son encontre, pour une durée de cinq à quinze ans.
6.2. Le recourant conteste son expulsion en se fondant uniquement sur son acquittement du chef d'infraction à l'<ref-law>. Dès lors qu'il ne l'obtient pas (cf. supra consid. 5) et qu'il a bien commis une infraction au sens de l'art. 66a al. 1 let. o CP, son argumentation tombe à faux. Pour le surplus, il ne formule aucun grief contre le prononcé de l'expulsion (<ref-law>).
7.
Au vu de ce qui précède, le recours doit être partiellement admis, l'arrêt attaqué annulé et la cause renvoyée à l'autorité cantonale pour qu'elle rende une nouvelle décision dans le sens des considérants (cf. consid. 2.5 supra). Pour le reste, le recours doit être rejeté dans la mesure où il est recevable.
Le recourant, qui n'obtient que partiellement gain de cause, supportera une partie des frais judiciaires (<ref-law>); il peut prétendre à des dépens réduits à la charge du canton de Fribourg (<ref-law>), lequel est dispensé de tout frais (<ref-law>).
La cause étant jugée, la demande d'octroi de l'effet suspensif n'a plus d'objet.

Par ces motifs, le Tribunal fédéral prononce :
1.
Le recours est partiellement admis, le jugement attaqué annulé et la cause renvoyée à la cour cantonale pour nouvelle décision. Pour le surplus, le recours est rejeté dans la mesure où il est recevable.
2.
Une partie des frais judiciaires, arrêtée à 1'500 fr., est mise à la charge du recourant.
3.
Le canton de Fribourg versera au recourant une indemnité de 1'500 fr. à titre de dépens réduits pour la procédure devant le Tribunal fédéral.
4.
Le présent arrêt est communiqué au recourant, au Ministère public de l'Etat de Fribourg et au Tribunal cantonal de l'Etat de Fribourg, Cour d'appel pénal.
Lausanne, le 6 septembre 2021
Au nom de la Cour de droit pénal
du Tribunal fédéral suisse
La Présidente : Jacquemoud-Rossari
La Greffière : Thalmann